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