python文档中的这段斐波那契代码与我的重新实现相比,我做错了什么?
Python文档:python文档中的这段斐波那契代码与我的重新实现相比,我做错了什么?,python,fibonacci,comma,Python,Fibonacci,Comma,Python文档: >>> def fib(n): a,b=0,1 while a<n: print a, a,b=b,a+b >>> fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 def fib(n): a、 b=0,1 而fib(2000年) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3
>>> def fib(n):
a,b=0,1
while a<n:
print a,
a,b=b,a+b
>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
def fib(n):
a、 b=0,1
而fib(2000年)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
我的重新实施:
>>> def fib2(n):
a=0
b=1
while a<n:
print a
a=b
b=a+b
>>> fib2(2000)
0
1
2
4
8
16
32
64
128
256
512
1024
def fib2(n):
a=0
b=1
而a>>fib2(2000)
0
1.
2.
4.
8.
16
32
64
128
256
512
1024
但是a,b=b,a+b
这更像是一个蟒蛇式的
a,b=b,a+b
及
在第二种情况下,a
被赋值为b
,然后b
被赋值为a
和b
之和,这意味着它是原始值的两倍
考虑:
a = 1
b = 2
a,b = b,a+b
这给
a==2 (old value of b)
b==3 (sum of 1 and 2)
相反地:
a = 1
b = 2
a = b
b = a + b
其中:
a==2 (old value of b)
b==a+b==2+2==4 (twice the old value of b)
不同之处在于,当您这样做时:
a,b=b,a+b
# ^
我标记的a
是a
的原始值,而不是更新后的值。这是因为Python总是先计算=
符号右侧的内容,然后再计算左侧的内容
但是,当您执行此操作时:
a=b
b=a+b
第二行中的a
是在上一行中分配的a
的新值。这会导致您的计算被关闭
有关更多信息,请参阅Python中的
要获得与Python文档中的函数相同的行为,您需要一个临时变量来保存
a
的原始值:
tmp=a
a=b
b=tmp+b
下面是一个演示:
>>> def fib2(n):
... a=0
... b=1
... while a<n:
... print a, # The comma causes everything to be printed on one line
... tmp=a
... a=b
... b=tmp+b
...
>>> fib2(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>>
更像是蟒蛇。尽管我建议您放置一些空格:
a, b = b, a+b
可读性是Python的一切。我相信这是逗号语法的一个细节。尝试:
c=b
b=b+a
a=c
谢谢,我是python新手,这是一个非常有用的答案,在我完成之前,python与Java是如此不同!谢谢,我是python新手,这是一个非常有用的答案,在我完成之前,python与Java是如此不同!将其实现为这样一个递归函数会更容易:但将其递归为一个巨大的n不会使程序比pyth docs实现慢吗?@Aditya_Pan我怀疑它会变慢。但是,对于大型n来说,一个潜在的问题是,它将耗尽堆栈空间并抛出stackOverFlow错误。递归执行最适合函数式编程语言。最好在python中迭代执行
>>> def fib2(n):
... a=0
... b=1
... while a<n:
... print a, # The comma causes everything to be printed on one line
... tmp=a
... a=b
... b=tmp+b
...
>>> fib2(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>>
a,b=b,a+b
a, b = b, a+b
c=b
b=b+a
a=c