如何根据列表的总和返回符号?

时间:2019-05-27 05:27:40

标签: unresolved-external

所以我是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))))

1 个答案:

答案 0 :(得分:0)

您的代码经过适当缩进,如下所示:

(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内,代码是三个表达式的列表,分别为cond,形式('divisible_by_2)和形式('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)