【问题标题】:how to get the product of a tree in scheme如何在方案中获得树的产品
【发布时间】:2020-09-13 18:41:41
【问题描述】:

我第一次使用方案,并且由于某种原因我试图获得树的产品,当运行我的程序时,我收到了这个错误: 1 ]=>(产品 t1)

;对象()不适用。 ;要继续,请使用选项号调用 RESTART: ; (RESTART 2) => 指定一个程序来代替它。 ; (RESTART 1) => 返回到 read-eval-print 级别 1。

这是我的代码:

(define (node x l r)   ; x is data, l is left, r is right
  (lambda (s)
    (cond  ((= s 0) x)
           ((= s 1) l)
           ((= s 2) r)
           (#t 'error))))

(define (data t) (t 0))
(define (left t) (t 1))
(define (right t) (t 2))

(define (size t) (if null? t) 0 (+ 1 (size (left t)) (size (right t))))
(define (product t) (if null? t) 0 ( * (data t)(product(left t)) (product (right t))))

(define t1 (node 5 (node 3 '() '()) (node 8 (node 7 '() '()) '())))

【问题讨论】:

  • 为什么将节点表示为lambda?使用列表会容易得多。
  • 我认为学习使用 lambda 表示数据是非常宝贵的经验。对于特定的用例,有更合适的数据结构,例如列表,但 lambdas 足够通用,您可以使用它来建模任何东西,而无需了解任何专门的结构。

标签: scheme binary-tree


【解决方案1】:

if 语句中的括号是错误的。 if 接受三个参数:

1 - 计算真假的表达式

2 - 如果 1 为真,则要评估的表达式

3 - 如果 1 为假,则要评估的可选表达式

例如:

(if (null?t)(execute-this-if-true)(execute-this-if-false))

而不是

(如果为空?t)(执行这个如果真)(执行这个如果假)

当您的代码尝试评估空列表的乘积时,它会进入 if 语句;空值?求出一个函数,认为是真值**,然后尝试求值(),这是不可能的

** 在方案中,除了#f 之外的任何东西都是真的

我怀疑算法也有错误;每当它遇到一个空列表时,它都会返回零,并且任何零的乘积始终为零,因此程序将始终返回零。 () 应该可能返回 1。

【讨论】:

    【解决方案2】:

    试试这个:

    (define node
      (lambda (n ret)
        (if (null? n)
            (ret 1 false false)
            (if (integer? n)
                (ret n false false)
                (ret (cadr n) (caddr n) (cadddr n))))))
    
    (define prod
      (lambda (n)
        (if n
            (node n (lambda (x l r) (* x (prod l) (prod r))))
            1)))
    
    (define t1 '(node 5 (node 3 () ()) (node 8 (node 7 () ()) ())))
    
    (display (prod t1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多