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

This program is designed to take a number and a function as inputs and do the following..

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

An example input would be:

(generalized-triangular square 3)

The Error message:

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

4 回答 4

4

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

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

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

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

(if <condition> ; condition
    (begin      ; consequent
      <expression1>
      <expression2>)
    (begin      ; alternative
      <expression3>
      <expression4>))

或者,您可以使用cond具有隐含的 a begin

(cond (<condition>   ; condition
       <expression1> ; consequent
       <expression2>)
      (else          ; alternative
       <expression3>
       <expression4>))
于 2013-09-09T15:34:03.863 回答
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 有一个非正式的风格指南,也推荐这个。

于 2013-09-09T15:39:17.687 回答
0

由于您使用的是球拍标签,我假设generalized-triangular仅使用标准方案不需要实现。if在这种情况下,可以用球拍语言编写一个非常简洁高效的版本(根本不使用):

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

除了标准 Scheme 之外,还有两件事需要理解才能理解这个定义,您可以在 Racket Reference 中轻松查找:如何for/sum工作以及非负整数在用作序列时的行为方式。

于 2013-09-10T09:38:20.923 回答
0

这是尾递归

(define (generalized-triangular f n-max)
  (let loop ((n 1) (sum 0))
    (if (> n n-max)
        0
        (loop (+ n 1) (+ sum (f n))))))
于 2013-09-09T22:36:39.240 回答