计算递归调用

时间:2013-11-26 02:15:49

标签: java math recursion

是否有一个数学公式来计算在不必检查我的编译器的情况下为下面的函数调用递归函数的次数

当使用调用调用时,将以递归方式调用mystery2多少次      mystery2(1000)?

 public void mystery2(int n)
   {
  if (n <= 1)
    System.out.print(n);
  else 
  {
    mystery2(n / 2);            
    System.out.print(", " + n);
  }
}

1,3,7,15,31,62,125,250,500,1000 = 10次

5 个答案:

答案 0 :(得分:3)

使用log2(n)中的ceil

ceil(log2(1000)) = ceil(9.966) = 10

答案 1 :(得分:3)

没有&#34;公式&#34;,但有一种解决复发的一般技术。这里有重复

N(x) = 1 + N(floor(x / 2))

以基本情况

N(1) = 1

N(x)的定义是&#34;如果mystery2的初始参数是x&#34;则调用N(x) = 1 + log_2(x) 的次数。

复发通过&#34;技巧和#34;学习像集成公式或其他花哨的数学,如生成函数。有时候近似值是你能做的最好的。在你的情况下,如果我们取消场内操作员(或假设x是2的幂),那么很明显

x

我们可以验证这一点。如果N(x) = 1 + 0 = 1为1,则为x = 2。对于N(x) = 1 + 1 = 2,我们有x = 1024等等......对于N(x) = 1 + 10 = 11,它是x

使用floor操作符,确切的答案会更复杂,具体取决于{{1}}的奇数因子的数量,但上面的公式将始终接近。

答案 2 :(得分:2)

另一个选择是将计数传递给您的方法;

public void mystery2(int n) {
  mystery2(n, 1);
}

public void mystery2(int n, int count) {
  if (n <= 1)
    System.out.print(n);
  else 
  {
    mystery2(n / 2, count+1);            
    System.out.print(", " + n + ":count=" + count);
  }
}

编辑:我想到了一个更好的方法。您可以像这样返回计数。

public static void mystery2(int n) {
    System.out.print("\ncount = " + mystery2(n, 1));
}

public static int mystery2(int n, int count) {
    if (n <= 1) {
        System.out.print(n);
        return count;
    }

    System.out.print(n + ", ");
    return mystery2(n / 2, count + 1);
}

答案 3 :(得分:1)

使用静态变量或全局

public void mystery2(int n)
{
  static count = 0;
  count++;
  system.out.print("We have called this " + count + "times before...");
  if (n <= 1)
    System.out.print(n);
  else
  {
    mystery2(n / 2);            
    System.out.print(", " + n);
  }

}

答案 4 :(得分:1)

在方法之外创建一个像mysteryCnt = 0的变量; (必须初始化为0)然后在ELSE块内部增加它的方法,mysteryCnt ++;这可能有用。

else{
   mystery2(n / 2);
   mysteryCnt ++;
   System.out.println(", " + n);
}

Jonny Z有正确的想法,但是你不能在方法中初始化变量,否则它永远不会超过1;他这样做的方式,每当你调用方法时,它将设置为0然后增加到1。