我如何 return 基于列表总和的符号?

How can I return symbols based on the sum of lists?

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

我尝试总结列表的元素(仅由数字组成)。如果总数是偶数,程序应该return <'divisible_by_2>。 如果总量是奇数,应该return <'not_divisible_by_2>.

最初的步骤是构建一个汇总列表的过程。这个有效。第二步是构建一个 if 函数,它获取列表的总和,如果总和是偶数,则取 returns <'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=树;树数=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))))

你的代码,正确缩进后,看起来像这样:

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

换句话说,如果你的测试成功了,你就return一个匿名函数,如果测试失败,你就return什么都没有(在Scheme中,这种情况下的值是未定义的)。

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

形式

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

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

因为你已经有了一个中间函数,你可以把它关联到一个名字:

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

我将其命名为 tree-count 因为您还递归到列表的 car

拥有此功能后,只需应用即可:

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