方案中的语法错误

时间:2017-12-07 19:56:12

标签: racket

我在Scheme中有一个递归函数,当我返回它时会返回: lambda:只需要函数体的一个表达式,但找到3个额外的部分

我要做的是在列表中使用值调用此函数' lst'。这递归地获取列表中所有可能的分区,

1 个答案:

答案 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))])))

替代方案,因为letlambda来电,您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甚至重写结束括号以匹配匹配的开头括号的类型。