在树中循环并对racket中的所有值求和?
我试图编写一些通用方法,它使用两个参数(树、函数)在树节点上迭代,并将树节点传递给方法 例如,我有一个名为fold的方法,它将二叉搜索树作为第一个参数,函数作为第二个参数,而参数方法则使用四个参数(键值left node key right node key) 下面是一些可以传递给上述在树中循环并对racket中的所有值求和?,racket,Racket,我试图编写一些通用方法,它使用两个参数(树、函数)在树节点上迭代,并将树节点传递给方法 例如,我有一个名为fold的方法,它将二叉搜索树作为第一个参数,函数作为第二个参数,而参数方法则使用四个参数(键值left node key right node key) 下面是一些可以传递给上述foldmethod的方法: 第一种方法可以是sumAll (define (sumAll key value leftValue rightValue) (if (null? key) 0
fold
method的方法:
第一种方法可以是sumAll
(define (sumAll key value leftValue rightValue)
(if (null? key)
0
(+ key leftValue rightValue)
)
)
第二种方法可以是findminium
(define (findMinimum key value leftValue rightValue)
(if (null? key)
'()
(if (null? leftValue)
key
leftValue
)
)
)
使用:
但我从fold方法中得到了这个错误:
+: contract violation
expected: number?
given: '()
argument position: 2nd
other arguments...:
任何关于我为什么会犯这个错误的线索 通过接受任何过程proc和基本case值init,您可以使
折叠
足够抽象,并让过程在所有节点上应用参数函数,如下所示:
(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
(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