我在Scheme中有一个递归函数,当我返回它时会返回: lambda:只需要函数体的一个表达式,但找到3个额外的部分
我要做的是在列表中使用值调用此函数' lst'。这递归地获取列表中所有可能的分区,
答案 0 :(得分:1)
define
必须是lambda中的第一个表达式。因此,您的defien
生病了。
此外,您cond
在第一个学期结束后结束,其余代码将无条件执行,cond
为死代码,因为它不会改变结果。
具有最小更改的最接近正确的语法是:
(define glcm
(lambda (lst s1 s2)
(cond
[(null? lst) (lcm s1 s2)]
[else
(let ([a (glcm (cdr lst) (+ s1 (car lst)) s2)]
[b (glcm (cdr lst) s1 (+ s2 (car lst)))])
(if (< a b) a b))])))
替代方案,因为let
是lambda
来电,您define
内可以let
:
(define glcm
(lambda (lst s1 s2)
(cond
[(null? lst) (lcm s1 s2)]
[else
(let ()
(define a (glcm (cdr lst) (+ s1 (car lst)) s2))
(define b (glcm (cdr lst) s1 (+ s2 (car lst))))
(if (< a b) a b))])))
但是我会这样做:
(define (glcm lst s1 s2)
(if (null? lst)
(lcm s1 s2)
(min (glcm (cdr lst) (+ s1 (car lst)) s2)
(glcm (cdr lst) s1 (+ s2 (car lst))))))
他们很可能变成非常相似的目标代码。使用您认为最易读的内容。
注意我使用[...]
。这些与(...)
无法区分,所以它只是一个可视化队列,使其更具可读性。在R5RS之前,您必须仅使用(...)
才能兼容。 DrRacket IDE甚至重写结束括号以匹配匹配的开头括号的类型。