下面的代码是使用矩阵求幂计算python中第n个术语og fibonacci序列用于各种测试用例t。但程序给出了荒谬的输出。请告诉我我错在哪里。当我在C ++中运行代码时它运行完美
class matrix:
def __init__(self):
self.a=self.b=self.c=1
self.d=0
def mul(self,e,f):
ret = matrix()
ret.a=(e.a*f.a)+(e.b+f.c)
ret.b=(e.a*f.b)+(e.b+f.d)
ret.c=(e.c*f.a)+(e.d+f.c)
ret.d=(e.c*f.b)+(e.d+f.d)
return ret
def exp(self,a,p):
if(p==0):
temp=matrix()
temp.a=temp.b=temp.c=temp.d=1
return temp
if(p==1):
return a
if(p%2==0):
return self.exp(self.mul(a,a),p/2)
else:
return self.mul(a,self.exp(self.mul(a,a),(p-1)/2))
def fib(self,n):
if (n==0):
return 0
if (n==1):
return 1
s=matrix()
s=self.exp(s,n)
return s.d
t=int(raw_input())
while(t>0):
v=matrix()
n=int(raw_input())
print v.fib(n)
t=t-1
答案 0 :(得分:1)
问题在于您的__init__
功能。在python中,所谓的变量只是对内存中数据的“标记”。为了与C / C ++进行比较,可以将它们视为指针。当您指定self.a = self.b = self.c
时,基本上是为内存中的相同数据分配三个不同的名称。您在a
中所做的任何更改都会反映在b
和c
中,依此类推。
对于需要三个单独变量的问题,更改__init__
函数的一种方法是:
self.a, self.b, self.c = 1, 1, 1
或者您可以使用copy
。 copy()
告诉python分配一个新的内存位置,然后将右侧的标记分配给该位置。有关此http://docs.python.org/2/library/copy.html的正式文档,请阅读更多信息。您还可以在Python Tutorial: Shallow and Deep-copy
答案 1 :(得分:0)
按重要性排列有几个问题:
1)你的乘法是错误的。注意你有总和的右边的乘法:
def mul(self,e,f):
ret = matrix()
ret.a=(e.a*f.a)+(e.b*f.c)
ret.b=(e.a*f.b)+(e.b*f.d)
ret.c=(e.c*f.a)+(e.d*f.c)
ret.d=(e.c*f.b)+(e.d*f.d)
return ret
2)在最后一行,您执行return s.d
但是您应该返回s.b
或s.c
,否则您将获得少一个斐波那契。
3)行temp.a=temp.b=temp.c=temp.d=1
不是必需的,因为构造函数完成了工作。除此之外是错误的,因为d
应该是0
。
4)为什么mul
和exp
类函数不使用self
。它没有坏处,但它们应该是@staticmethod
5)同样,它没有坏处,但你的第二次递归调用是不必要的复杂。只需写下:
return matrix.mul(a,matrix.exp(a, p-1))
答案 2 :(得分:0)
我不确定您是否需要使用矩阵求幂来解决此问题。不幸的是,我还不太了解Python类。但是,以下代码执行问题标题所需的内容:查找第n个Fibonacci数。下面我将其描述为F_n。请注意n值较低的初始条件。
def fibN( n ):
"""
fibonacci: int -> int
Returns F_n.
Note: F_1 = 0, F_2 = 1, F_3 = 1, F_4 = 2
"""
n = abs( int( n ))
if n == 0:
fib = 0
elif n == 1:
fib = 1
else:
counter = 2
f0 = 0
f1 = 1
fib = f0 + f1
while counter <= n:
fib = f0 + f1
f0 = f1
f1 = fib
counter += 1
return fib