2013-03-14 141 views
1

程序显示的结果“5”,但我看不出它是如何获取到这个问题的答案,因为那进行的“+1”,“结果谜(N/20)+ 1”为什么这种递归方法的功能是这样的?

灿任何人都可以通过计算机采取的逻辑步骤来获取此信息?

public class Experimental{ 

    public static int mystery(int n){ 
     if (n <= 0) { return 0; } 
     return mystery(n/2) + 1; 
     }//ends method 

public static void main(String[] args){ 
    System.out.println(mystery(20)); 
}//ends method 
}//ends class 
+0

20,10,5,2,1,0。 – nneonneo 2013-03-14 21:20:55

+0

到目前为止,我只将它看作是(n/2)部分。它一直在减半,直到最终达到0,但是什么时候“+1”才起作用? – 2013-03-14 21:33:26

回答

1

这是一个递归调用。它在n等于零时结束(它永远不会变为负数)。它需要2个5格来达到零。要做的最好的事情就是拿一张纸,看看这是怎么展开的。

mystery(20/2) + 1 = 
(mystery(20/2/2) + 1) + 1 = 
((mystery(20/2/2/2) + 1) + 1) + 1 = 
(((mystery(20/2/2/2/2) + 1) + 1) + 1) + 1 = 
((((mystery(20/2/2/2/2/2) + 1) + 1) + 1) + 1) + 1 = 
0 + 1 + 1 + 1 + 1 + 1 = 5 

希望这会有所帮助。计算机在递归方面比人类好得多...

+0

完美。不久,当我解锁这个能力时,你就会得到满意的结果。 – 2013-03-14 21:35:37

+0

你也可以接受答案;) – 2013-03-14 21:48:16

0

是的!事实上,一个调试器如gdb可以让你通过计算机采取的逻辑步骤。

  1. -g标志编译程序。
  2. 运行gdb a.out(或您的程序名称)。
  3. Google gdb cheatsheet了解如何设置断点并逐步执行代码。
+0

这里总是新手,我该如何编译一个带有“-g标志”的程序?那是什么?我该如何去做第二步? – 2013-03-14 21:26:28