(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)
答案 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)))
问题是input
。 if
的格式为(if <cond> <then> <else>)
。不计算if
本身,它有3个部分。上面的代码提供了4。
真实答案
两个提示:
使用DrRacket编写代码,让它帮助您进行缩进。我无法理解您的原始代码。 (即使在有人为你编辑之后,缩进也有点不稳定,因为在精神上仍难以解析。)
我不了解您的课程,但对于“真正的”球拍代码,我建议您使用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>