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)))