我有这个递归函数: F(n)= 4F(n-1)+ F(n-2),对于所有n> = 2,其中F(0)= 0且F(1)= 1。 这是我在python中的代码
def f(n):
res = 0;
if n == 0:
return 0
elif n == 1:
return 1
else:
res=(4*(f(n-1)))+f(n-2)
return res
print f(2424)
Java中的方法:
static public long f(int n){
long res = 0;
if(n==0){
return 0;
}else if(n==1){
return 1;
}else{
res=(4*(f(n-1)))+f(n-2);
}
return res;
}
我只是在主要的地方叫它:
public static void main(String[] args) {
System.out.println("Answer "+f(2424));
}
我必须评估F(2424),但需要很长时间才能在5小时后完成程序。我想知道我做错了什么或者是否有更好的方法来做到这一点。我对C,C ++或Mathematica等其他lenguajes持开放态度。我知道它有效,因为数字较小,它给出了正确的答案。 F(2424)的答案是一个非常大的数字,就是这样:
1281164511188763152547512834040975438370201032465436062494215454022879134064217349208869010577125688465422144704470288714758990792115349616623643769593935525269710380177867746208518892409818272508807650302268527076038721978730073753893097810064552557803220544917467355666751736789451539504450636395291929172451449463996726060365432143502604816221037486542202848574347687238119003684559306772150548489964166919347174143520307708781896553497082723700886172054633377639869151809420630129943072336296054265559251248360505214444991114744638397276157118083247742605998741092249862259923389041600182765924424601825266131766817658887619152447664445827818017590759556408957846405354128988965835308544959534563811495627789437744026580918732874662070092966040360706395626472895720002618224254650890433136565739395695366540546770907502187374671730106884474281264080489835845034114700607099223111430962041379772830536394485723124863377721568117804871455596058328576942326957734709231845259795937644298489859780 6086880665642171452358839585066290931829822758230731077830945167265530809939378117473625279556317267462647249640436890625269088579237115076783934027795187388832606550708659435481536443442236758890740290467476423736762596428858930168539918890341426049891374123602486910741965206888619217749898476459891203923419562022513871112849590210261873642501502900252092855836815672262020860038323118100356786638630880435236412040943537555010407001968832788551740072702579610201398332444667655843894415660856081122556945790699471646832
或者它只是一个非常繁重的程序,我只需要等待?
答案 0 :(得分:4)
我们来看一个会调用n == 5
和f(4)
的{{1}}示例。那些人将再次致电f(3)
,f(3)
,f(2)
和f(2)
。你可以看到有很多多余的评价,当你去更大的f(1)
时会出现这种雪球。
所以,只要跟踪你已经计算过的东西,事情会急剧加速:
n
更新:无法抗拒添加高科技解决方案。它使用数学势座称为环 Z [sqrt(5)]的矩阵表示来评估封闭形式解决方案。这是必要的,因为如果n很大,浮点数就不够准确。
def f(n):
res = 0;
if n == 0:
return 0
elif n == 1:
return 1
else:
res=(4*(f(n-1)))+f(n-2)
return res
def f_all(n):
res = (n+1)*[0]
res[1] = 1
for i in range(2, n+1):
res[i] = 4*res[i-1] + res[i-2]
return res
print f(10) == f_all(10)[-1]
print f_all(2424)[-1]
答案 1 :(得分:2)
答案 2 :(得分:0)
答案 3 :(得分:0)
可以使用装饰器@lru_cache
实现更优雅的解决方案。
这避免了在for
循环下跟踪存储计算值的麻烦。
比较这两种实现方式。
在我的计算机上,需要约 1分钟来执行fibonacci_recursive(40)
def fibonacci_recursive(n):
# Base case
if n == 0:
return 0
elif n == 1:
return 1
# Recursive case
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
现在,需要大约 7毫秒来执行fibonacci_recursive(40)
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci_recursive(n):
# Base case
if n == 0:
return 0
elif n == 1:
return 1
# Recursive case
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
装饰器缓存结果,通过在尝试计算值之前检查该值来避免显式重新计算。 我找到了此解决方案here。精彩的文章!
答案 4 :(得分:-1)
使用高级演示语言,您无法做到这一点。如果您真的希望获得最佳优化,则需要进行组装。但是一旦达到这个水平,你就会意识到不会有太大变化。为什么?看看代码。优化并不多。如果你去C,你可能会发现很棒的编译器会给你一个很好的可执行文件,但仍然出于下面说明的原因,它并不重要。
您的斐波那契问题
您当前的问题有解决方案。此解决方案取决于输入以及解决方法。现在正在查看您的算法,您正在处理解决问题的指数时间复杂度:O(2 ^ n)。这意味着小输入将为您提供快速的良好结果,但2424将花费大量时间。
<强> 实施例 强>
假设时间单位是秒,你输入2. 2次幂2会在4秒内给你解决方案。
Enter 2424。这将使您现在 4.97e + 729秒。这假设您在两次计算中都使用相同的硬件。请注意,我没有考虑过你的#4;时间4&#34;对于左侧递归调用。
解决方案?
现在回答你的问题。它对你转换的语言也不重要。使用此算法解决此问题所需的时间非常长,因此在同一硬件上更改语言无关紧要。即使你使用编译语言。
即使并行化该算法也是不可能的,因为每个f(n)结果取决于4 * f(n-1)和f(n-2)。你必须以一种可能的方式重写它,然后获得大量的内核或GPU处理能力来处理这个问题。但在这一点上,我离题了。
启动它然后去散步:)