我有以下功能:
public static long Fibon(long num)
{
if (num == 1)
{
return 1;
}
else if (num == 2)
{
return 1;
}
return fibon(num - 1) + fibon(num - 2);
}
此函数使用递归来计算Fibonacci数。如何在执行此功能之前计算执行此功能所需的堆栈内存量?例如,我想在几个具有大数字的独立线程中执行此函数,并且在执行线程之前,我想知道我需要多少堆栈内存。
答案 0 :(得分:1)
只要看一下,代码就不会起作用,因为当num == 2时,该方法会尝试找到fibon(0)。
尝试
public static long Fibon(long num)
{
if (num == 1)
{
return 1;
}
else if (num == 2)
{
return 1;
}
return fibon(num - 1) + fibon(num - 2);
}
会给你1,1,3,3,5 ......
对不起,这不是一个答案,我没有评论的声誉。
编辑:您还可以使用ulong计算更多的条目。
答案 1 :(得分:1)
由于您只需记住前两个术语来计算当前术语,因此如果使用非递归过程,您将不会遇到任何内存问题:
public static long Fibon(long num)
{
long result ;
if (num == 1) { return 1; }
else if (num=2) { return 1; }
long grandfather = 1 ;
long father = 1 ;
for (in i=2;i<=num;i++)
{
result = father + grandFather;
grandfather = father ;
father = result ;
}
return result ;
}
答案 2 :(得分:0)
对于n
斐波那契项,函数所需的内存量为O(n)
,即斐波纳契数列中术语索引的线性。更准确地说,它将是每次递归调用所需内存量的n-1
倍,这是依赖于实现的(加上一些常量)。
所需的内存量等于每个递归调用中的内存量加上“执行树”的“深度”。在每次递归调用中,您终止或发出两个新调用,一个在参数n-1
上,另一个在参数n-2
上;很明显,这必须在n-1
电话后停止。
如果您将整个过程想象为包含标记为f(k)
的节点的二叉树,其中节点f(k)
的左侧子标记为f(k-1)
,右侧子级标记为f(k-2)
,那么f
的空间复杂度对应于执行树的深度。
答案 3 :(得分:0)
我相信所需的长数实际上等于返回的长数。
要返回2,您需要添加2个长号。要返回3,您需要添加返回2(长度为2)所需的长度数量为1 = = 3.模式继续。
由于long是64位,所需的内存等于fibonacci值* 64位。