if:语法错误(方案编程)

时间:2013-09-09 15:29:38

标签: lisp scheme racket

(define generalized-triangular
  (lambda (input n)
    (if (= n 1)
        1
        (+ (input n) (generalized-triangular (- n 1))))))

此程序旨在将数字和函数作为输入并执行以下操作。

f(1) + f(2) + f(3)+ … + f(N).

示例输入是:

(generalized-triangular square 3)

错误讯息:

if: bad syntax;
has 4 parts after keyword in: (if (= n 1) 1 (+ (input n) (generalized-triangular (- n 1))) input)

4 个答案:

答案 0 :(得分:4)

错误非常明确 - if形式在条件之后只能有两个部分 - 结果(如果条件为真)和替代(如果条件为假)。也许你的意思是这个?

(if (= n 1)
    1
    (+ (input n) (generalized-triangular input (- n 1))))

我从原始代码移动input,它位于错误的位置,因为对generalized-triangular的调用需要两个参数,顺序正确。

对于记录:如果您需要在结果或替代方案中执行多个表达式(对于您的问题不是这种情况,但了解它有用),那么您必须将它们打包在{ {1}},例如:

begin

或者,您可以使用(if <condition> ; condition (begin ; consequent <expression1> <expression2>) (begin ; alternative <expression3> <expression4>)) ,其中包含隐式cond

begin

答案 1 :(得分:3)

字面答案

您在问题中发布的代码很好:

(define generalized-triangular
  (lambda (input n)
    (if (= n 1)
        1
        (+ (input n) (generalized-triangular (- n 1))))))

您的问题中的错误消息将类似于以下代码:

(define generalized-triangular
  (lambda (input n)
    (if (= n 1)
        1
        (+ (input n) (generalized-triangular (- n 1)))
        input)))

问题是inputif的格式为(if <cond> <then> <else>)。不计算if本身,它有3个部分。上面的代码提供了4。

真实答案

两个提示:

  1. 使用DrRacket编写代码,让它帮助您进行缩进。我无法理解您的原始代码。 (即使在有人为你编辑之后,缩进也有点不稳定,因为在精神上仍难以解析。)

  2. 我不了解您的课程,但对于“真正的”球拍代码,我建议您使用cond代替if。 Racket也有一个非正式的风格指南,也推荐这个。

答案 2 :(得分:0)

这是尾递归

(define (generalized-triangular f n-max)
  (let loop ((n 1) (sum 0))
    (if (> n n-max)
        0
        (loop (+ n 1) (+ sum (f n))))))

答案 3 :(得分:0)

由于你正在使用racket标签,我认为generalized-triangular的实现不需要仅使用标准Scheme。在这种情况下,可以使用racket语言编写一个非常简洁高效的版本(根本不使用if):

(define (generalized-triangular f n)
  (for/sum ([i n]) (f (+ i 1))))

除了标准Scheme之外,还有两件事需要理解,以便理解这个定义,您可以在“球拍参考”中轻松查找:for/sum如何工作以及非负整数在用作序列时的行为方式。< / p>