我尝试编写一些泛型方法,它接受两个参数(树,函数)迭代树节点并将树节点传递给方法 例如,我有一个名为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
任何线索为什么我收到此错误。
答案 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