首页 > 解决方案 > 如何根据列表的总和返回符号?

问题描述

所以我是Scheme的新手,遇到了一个问题。我想要做的是以下。这是一个相当简单的问题,但我收到了几个错误:

我尝试总结列表的元素(仅由数字组成)。如果总金额是偶数,则该过程应返回 <'divisible_by_2>。如果总金额为奇数,则应返回 <'not_divisible_by_2>。

最初的步骤是建立一个总结列表的过程。这个有效。第二步是构建一个 if 函数,它接受列表的总和,<'divisible_by_2>如果总和为偶数,<'not_divisible_by_2>则返回奇数。

到目前为止我写的:

(define (divisible_or_not list-sum lst)

(if (odd? list-sum lst)
  (lambda (list-sum lst) 
                        (cond
                          ((null? lst)
                           0)
                          ((pair? (car lst))
                           (+(list-sum (car lst)) (list-sum (cdr lst)))
                          (else
                           (+ (car lst) (list-sum (cdr lst)))
                          )         
                          )
                        )
    ('divisible_by_2)
    ('not_divisible_by_2)
  )
)

)

2.0 版(lst=tree;tree-count=sum-lst):

(define (divisible-or-not tree)
  (define (tree-count tree)
    (cond
      ((null? tree)
        0)
      ((pair? (car tree))
        (+(tree-count (car tree)) (tree-count (cdr tree)))
      (else
        (+ (car tree) (tree-count (cdr tree))))))
  (if (odd? tree-count tree)
    ('divisible-by-2)
    ('not-divisible-by-2))))

标签: unresolved-external

解决方案


正确缩进的代码如下所示:

(define (divisible_or_not list-sum lst)
  (if (odd? list-sum lst)
      (lambda (list-sum lst) 
        (cond
         ((null? lst)
          0)
         ((pair? (car lst))
          (+(list-sum (car lst)) (list-sum (cdr lst)))
          (else
           (+ (car lst) (list-sum (cdr lst))))))
        ('divisible_by_2)
        ('not_divisible_by_2))))

您的程序结构如下所示:

(if ... 
  (lambda (...) ...))

换句话说,如果你的测试成功,你返回一个匿名函数,如果测试失败,你什么也不返回(在Scheme中,值在这种情况下是未定义的)。

在您的 lambda 中,代码是三个表达式的列表, a cond, form('divisible_by_2)和 form ('not_divisible_by_2)

首先,不要使用下划线来分隔 Lisp/Scheme 中的单词,使用破折号,例如:divisible-by-2.

其次,只有最后一个表达式的值从 lambda 中返回,所以cond由于没有副作用,因此中间体基本上是白做的。第二种形式,('divisible_by_2)看起来像一个函数调用,但会给你一个错误。如果你想返回一个符号,只需引用它,不带括号:'divisible-by-2

由于您已经有一个中间函数,您可以将它与一个名称相关联:

(define tree-count (sum tree)
  (cond ...))

我命名它tree-count是因为你也递归到car你的列表中。

一旦你有了这个功能,你只需要应用它:

(if (even? (tree-count tree))
    'divisible-by-2
    'not-divisible-by-2)

推荐阅读