循环遍历树并总结球拍中的所有值?

时间:2017-04-18 03:14:00

标签: racket

我尝试编写一些泛型方法,它接受两个参数(树,函数)迭代树节点并将树节点传递给方法 例如,我有一个名为fold的方法,它将二进制搜索树作为第一个参数,并作为第二个参数,而参数方法采用四个参数(键值为left-node-key right-node-key)。

SELECT TableA.[No Urut(L1)], TableA.[No Tampil (L1)], TableA.[Text Faktor (L1)], TableB.[No Urut(L2)], TableB.[No Tampil (L2)], TableB.[Text Faktor (L2)]
FROM TableA
INNER JOIN TableB ON TableA.IDPK=TableB.IDFK;

这里有一些方法可以传递给上面的(define (fold tree function) (cond [(null? tree) (function '() '() '() '())] [(number? (car tree)) (+ (funct (car tree) (cadr tree) (caaddr tree) (car(cadddr tree))) (fold (cddr(caddr tree)) function) (fold (cddr(cadddr tree)) function) )] [else (function '() '() '() '())] ) ) 方法: 第一种方法可能是fold

sumAll

第二种方法可以是(define (sumAll key value leftValue rightValue) (if (null? key) 0 (+ key leftValue rightValue) ) )

findMinimum

使用:

(define (findMinimum key value leftValue rightValue)
  (if (null? key)
      '()
      (if (null? leftValue)
          key
          leftValue
      )
  )
)

但是我从折叠方法中得到了这个错误:

(define tr '(20 "20" (18 "18" ()(19 "19" () ())) (21 "21" (15 "15" () ()) ()) ))
(fold tr sumAll ) ; should return: 93
(fold tr findMinimum ) ; should return: 15

任何线索为什么我收到此错误。

1 个答案:

答案 0 :(得分:2)

您可以通过接受任何过程 proc 和基本案例值 init 来使fold足够抽象,并让过程在所有节点上应用参数函数如下:

(define (fold proc init lst)
  (cond
    [(null? lst) init]
    [else
     (proc (car lst)
           (fold proc init (caddr lst))
           (fold proc init (cadddr lst)))]))

然后,使用以下二叉搜索树示例定义:

(define BST '(20 "20" (18 "18" () (19 "19" () ())) (21 "21" (15 "15" () ()) ())))

您可以使用以下程序:

(fold + 0 BST)                             ; find sum
=> 93
(fold min 1000 BST)                        ; find min
=> 15