计算递归函数

时间:2015-07-03 09:09:24

标签: c# memory recursion

我有以下功能:

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数。如何在执行此功能之前计算执行此功能所需的堆栈内存量?例如,我想在几个具有大数字的独立线程中执行此函数,并且在执行线程之前,我想知道我需要多少堆栈内存。

4 个答案:

答案 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位。