Python 格式中的斐波那契函数

Python 格式中的斐波那契函数,python,scheme,fibonacci,Python,Scheme,Fibonacci,我正在尝试将斐波那契函数从python转换为scheme def fib(n): if n == 1: return 0 if n == 2: return 1 return fib(n-1) + fib(n-2) 到 我在这里得到错误,因为显然scheme需要一个else语句。然而,作为一个计划初学者,我不知道如何用else语句来表达。有人能帮忙吗?谢谢 试试看 (define (fib n) (if (= n 1)

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

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

我在这里得到错误,因为显然scheme需要一个
else
语句。然而,作为一个计划初学者,我不知道如何用else语句来表达。有人能帮忙吗?谢谢

试试看

(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)

但我建议您在某些方案解释器(特别是:在Racket中)中使用
cond
,所有
if
表达式必须有两部分:结果部分和替代部分(else部分)。因此,要修复代码,应该像这样嵌套
if
表达式(注意建议的缩进和关闭括号的方法):

但说实话,当有两个以上的条件时,您应该使用
cond
而不是嵌套
if
s,这样写起来更容易,读起来也更容易:

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

为了完整性:对于那些您确实非常想使用
if
而不使用
else
部分的情况,您可以在
when
时使用
。还有一点吹毛求疵:通常定义
fibonacci
的方法是,如果
n
0
,则返回
1
如果
n
1
;实际上,您的实现将返回不正确的结果。

您对斐波那契序列的定义是错误的:fib(0)=0,fib(1)=1,请参阅“单臂
如果
”,请参阅
除非
。您始终可以使用一些一次性值作为替代,例如
(如果(=n1)0'无)
。但是函数中只返回最后一个表达式的值,因此如果有几个这样的if,则只计算最后一个表达式的值。这就是为什么您应该使用嵌套的IFs(或COND)来有一个表达式(具有多个分支),其值将因此而返回。单独一行的括号不被认为是好的样式。@uselpa但这样更易于阅读和验证唯一您看到的是“更好”在本例中,您没有忘记任何右括号,这是以牺牲3行无用的行为代价的。但是您的实现和您的编辑器可能也会告诉您这一点。可读性的真正好处是通过适当的缩进来实现的。@uselpa好的,我明白了:)谢谢你的提示!
(define (fib n)
  (if (= n 1)
      0
      (if (= n 2)
          1
          (+ (fib (- n 1)) (fib (- n 2))))))
(define (fib n)
  (cond ((= n 1) 0)
        ((= n 2) 1)
        (else (+ (fib (- n 1)) (fib (- n 2))))))