Python 格式中的斐波那契函数
我正在尝试将斐波那契函数从python转换为schemePython 格式中的斐波那契函数,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)
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))))))