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