我对Fibonacci数的迭代算法很感兴趣,所以我在wiki上找到了公式...它看起来很直接,所以我在Python中尝试了它...它没有问题编译和公式看起来正确。 ..不确定为什么它给出了错误的输出......我没有实现它吗?
def fib (n):
if( n == 0):
return 0
else:
x = 0
y = 1
for i in range(1,n):
z = (x + y)
x = y
y = z
return y
for i in range(10):
print (fib(i))
输出
0
无
1
1
1
1
1
1
答案 0 :(得分:49)
问题是你的return y
在你的函数循环中。因此,在第一次迭代之后,它将已经停止并返回第一个值:1。除非n
为0,在这种情况下,函数将返回0
本身,并且{{1}当for循环不会迭代一次,并且没有n
正在执行时(因此return
返回值),这是1。
要解决此问题,只需将None
移到循环外部。
按照KebertX的例子,这是我个人用Python制作的解决方案。当然,如果您要处理许多Fibonacci值,您甚至可能希望将这两个解决方案组合起来并为数字创建缓存。
return y
答案 1 :(得分:4)
您在循环中返回一个值,因此该函数在y的值变为任何大于1之前退出。
如果我可以提出更短的内容,而且更加狡猾:
def fibs(n):
fibs = [0, 1, 1]
for f in range(2, n):
fibs.append(fibs[-1] + fibs[-2])
return fibs[n]
这将与您的算法完全相同,但不是创建三个临时变量,而是将它们添加到列表中,并按索引返回第n个斐波纳契数。
答案 2 :(得分:1)
在fib(0)上,你返回0因为:
if (n == 0) {
return 0;
}
在fib(1)上,你返回1是因为:
y = 1
return y
在图(2)中,你返回1是因为:
y = 1
return y
......等等。只要return y
在循环中,函数就会在每次for循环的第一次迭代时结束。
这是另一位用户提出的一个很好的解决方案: How to write the Fibonacci Sequence in Python
答案 3 :(得分:1)
python中的非递归Fibonacci序列
def fibs(n):
f = []
a = 0
b = 1
if n == 0 or n == 1:
print n
else:
f.append(a)
f.append(b)
while len(f) != n:
temp = a + b
f.append(temp)
a = b
b = temp
print f
fibs(10)
输出: [0,1,1,2,3,5,8,13,21,34]
答案 4 :(得分:0)
假设斐波那契序列的这些值:
F(0)= 0;
F(1)= 1;
F(2)= 1;
F(3)= 2
对于N的值> 2我们将用这个公式计算斐波纳契值:
F(N)= F(N-1)+ F(N-2)
我们可以采用的一种迭代方法是计算从N = 0到N = Target_N的斐波那契,因为我们这样做,我们可以跟踪先前的斐波纳契对于N-1和N-2的结果
public int Fibonacci(int N)
{
// If N is zero return zero
if(N == 0)
{
return 0;
}
// If the value of N is one or two return 1
if( N == 1 || N == 2)
{
return 1;
}
// Keep track of the fibonacci values for N-1 and N-2
int N_1 = 1;
int N_2 = 1;
// From the bottom-up calculate all the fibonacci values until you
// reach the N-1 and N-2 values of the target Fibonacci(N)
for(int i =3; i < N; i++)
{
int temp = N_2;
N_2 = N_2 + N_1;
N_1 = temp;
}
return N_1 + N_2;
}
答案 5 :(得分:0)
def fibiter(n):
f1=1
f2=1
tmp=int()
for i in range(1,int(n)-1):
tmp = f1+f2
f1=f2
f2=tmp
return f2
或并行分配:
def fibiter(n):
f1=1
f2=1
for i in range(1,int(n)-1):
f1,f2=f2,f1+f2
return f2
print fibiter(4)
答案 6 :(得分:0)
我在another thread遇到了这个问题,它比我尝试的任何其他事情都要快得多,并且不会超时。这是数学的link。
def fib(n):
v1, v2, v3 = 1, 1, 0
for rec in bin(n)[3:]:
calc = v2*v2
v1, v2, v3 = v1*v1+calc, (v1+v3)*v2, calc+v3*v3
if rec=='1': v1, v2, v3 = v1+v2, v1, v2
return v2
答案 7 :(得分:0)
这项工作(直观)
def fib(n):
if n < 2:
return n
o,i = 0,1
while n > 1:
g = i
i = o + i
o = g
n -= 1
return i
答案 8 :(得分:0)
这种简单但最快的方式怎么样......(我刚刚发现!)
def fib(n):
x = [0,1]
for i in range(n >> 1):
x[0] += x[1]
x[1] += x[0]
return x[n % 2]
请注意!因此,这个简单的算法只使用1个赋值和1个加法,因为循环长度缩短为1/2,每个循环包括2个赋值和2个加法。
答案 9 :(得分:0)
fcount = 0 #a count recording the number of Fibonacci numbers generated
prev = 0
current = 0
next = 1
ll = 0 #lower limit
ul = 999 #upper limit
while ul < 100000:
print("The following Fibonacci numbers make up the chunk between %d and %d." % (ll, ul))
while next <= ul:
print(next)
prev = current
current = next
next = prev + current
fcount += 1 #increments count
print("Number of Fibonacci numbers between %d and %d is %d. \n" % (ll, ul, fcount))
ll = ul + 1 #current upper limit, plus 1, becomes new lower limit
ul += 1000 #add 1000 for the new upper limit
fcount = 0 #set count to zero for a new batch of 1000 numbers
答案 10 :(得分:0)
另一种可能的方法:
a=0
b=1
d=[a,b]
n=int(input("Enter a number"))
i=2
while i<n:
e=d[-1]+d[-2]
d.append(e)
i+=1
print("Fibonacci series of {} is {}".format(n,d))
答案 11 :(得分:-1)
import time
a,b=0,1
def fibton(n):
if n==1:
time.clock()
return 0,time.clock()
elif n==2:
time.clock()
return 1,time.clock()
elif n%2==0:
read="b"
elif n%2==1:
read="a"
else:
time.clock()
for i in range(1,int(n/2)):
a,b=a+b,a+b
if read=="b":
return b,time.clock()
elif read=="a":
return.a,time.clock()
免责声明:我目前使用移动设备,这可能不完全正确
这种算法利用了其他一些民族的差距,现在它的速度提高了两倍。而不是仅将b
设置为a
,反之亦然,然后将a
设置为a+b
,我只需再添加2个字符即可完成两次。我还根据我的其他迭代算法的方式添加了速度测试。这应该能够在一秒内达到约200,000斐波纳契数。它还返回数字的长度而不是整数,这将需要永远。
我的另一个可以转到第二个Fibonacci数字,如内置时钟所示:10 ^ -6秒。这个可以在5 ^ -6左右做到。我将尽快获得一些更高级的算法,并以最快的速度进行优化。
答案 12 :(得分:-1)
可能的解决方案:
a=0
b=1
d=[a,b]
n=int(input("Enter a number"))
i=0
while len(d)<n:
temp=a+b
d.append(temp)
a=temp
b=d[i+1]
i+=1
print("Fibonacci series of {} is {}".format(n,d))
答案 13 :(得分:-2)
具体来说,您可以使用以下代码
def fib (n):
if( n == 0):
return 0
else:
x = 0
y = 1
for i in range(1,n):
y =y+x
x=y
return y
for i in range(10):
print (fib(i))
此处,x
是旧值,y
是当前值。在循环中,将y
(当前值)替换为y+x
(当前值+旧值),然后将当前值分配给x.Print
当前值