Scheme 如何在计划中求和树
不太确定我是否走对了路 通常,配对树是Scheme 如何在计划中求和树,scheme,racket,Scheme,Racket,不太确定我是否走对了路 通常,配对树是 一片叶子(不是一对),或 一对,其car和cdr值为对树 递归求和程序必须处理以下两种情况: 数字,即数字树的叶子,以及 成对,在这种情况下,它应该对左子树和右子树求和,并将这些和相加 所以, ;; A [BT X] is one of ;; - 'leaf ;; - (make-node X [BT X] [BT X]) (define-struct node (val left right)) ;; interpretation: rep
- 一片叶子(不是一对),或
- 一对,其car和cdr值为对树
- 数字,即数字树的叶子,以及
- 成对,在这种情况下,它应该对左子树和右子树求和,并将这些和相加
;; A [BT X] is one of
;; - 'leaf
;; - (make-node X [BT X] [BT X])
(define-struct node (val left right))
;; interpretation: represents a node with a value
;; a left and right subtree
(define (tree-sum tree)
(cond
[(symbol=? tree 'leaf) ...] ;; the value remains same
[(node? tree)
(+ (tree-sum (node-val tree))
(tree-sum (node-left tree))
(tree-sum (node-right tree)))]))
您可以将函数分为两部分—一部分将树转换为数字列表,另一部分仅用于该列表,
foldl
的优点是作为累加器自动进行求和
(define (pair-tree-sum pair-tree)
(cond
[(number? pair-tree)
pair-tree]
[else
(+ (pair-tree-sum (car pair-tree))
(pair-tree-sum (cdr pair-tree)))]))
你是否收到错误或意外输出?@Jack我还在写代码。想想是否最好用累加的方式求和。如果树只是一个数字列表,那就容易多了。然而,它是一个复杂的结构。你是在问一个
BT
树的求和问题,一个表示为嵌套列表的树,或者只是问你是否应该使用累加器?@molbdnilo有没有一种方法可以将树上的所有数字都转换成一个列表?我被特别要求不要使用foldl或任何其他循环函数来解决这个问题。任何建议?测试:(定义树(使节点4'叶(使节点5'叶)叶))
错误代码:+:需要一个数字作为第一个参数,给定(使节点4'叶(使节点5'叶))此解决方案不使用结构表示树。一棵树或者只是一个数字(一片叶子),或者是一对包含两棵树的数字。所以”(1(2.3)。4)
将是一棵树。没有涉及结构或其他数据结构,只涉及数字和对。
(define (tree->list tree)
(if (pair? tree)
(append (tree->list (car tree))
(tree->list (cdr tree)))
(list tree)))
(define (tree-sum tree)
(foldl + 0 (tree->list tree)))