2

我正在尝试将斐波那契函数从 python 转换为方案,

def fib(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
    return fib(n-1) + fib(n-2)

(define (fib n)
    (if (= n 1)
         0)
    (if (= n 2)
         1)
    (+ fib (- n 1)) (fib (- n 2)))

我在这里收到错误,因为显然方案需要else声明。但是,作为一个新手计划学习者,我无法弄清楚如何使用 else 语句来实现它。任何人都可以帮忙吗?谢谢。

4

2 回答 2

4

在某些 Scheme 解释器中(特别是:在 Racket 中),所有if表达式都必须有两个部分:consequent 和 Alternative(the elsepart)。因此,要修复您的代码,您应该if像这样嵌套表达式(并注意缩进和关闭括号的推荐方法):

(define (fib n)
  (if (= n 1)
      0
      (if (= n 2)
          1
          (+ (fib (- n 1)) (fib (- n 2))))))

但说实话,当条件多于两个的时候,你应该用cond嵌套代替if,这样写起来更容易阅读:

(define (fib n)
  (cond ((= n 1) 0)
        ((= n 2) 1)
        (else (+ (fib (- n 1)) (fib (- n 2))))))

为了完整起见:对于那些你真的非常想使用if没有else部分的情况,你可以使用when. 还有一点吹毛求疵:通常的定义方法fibonacci是返回0if nis 0,并返回1if nis 1; 因为它是您的实现将返回不正确的结果。

于 2013-11-07T20:32:36.380 回答
1

尝试

(define (fib n)
    (if (= n 1)
         0
         (if (= n 2)
             1
             (+ (fib (- n 1)) (fib (- n 2))))))

语法是:

(if predicate consequent alternative)

(if (> 3 2) 'yes 'no)

但我建议你cond在你的情况下使用

于 2013-11-07T20:30:25.840 回答