为什么这种递归方法以这种方式运行?

时间:2013-03-14 21:19:33

标签: methods recursion

该程序显示“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

2 个答案:

答案 0 :(得分:1)

这是一个递归调用。它在n等于零时结束(它永远不会变为负数)。它需要5个除以2才能达到零。你要做的最好的事情是拿一张纸,看看它是如何展开的。

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

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

答案 1 :(得分:0)

是的!实际上,诸如gdb之类的调试器可以指导您完成计算机所采用的逻辑步骤。

  1. 使用-g标志编译程序。
  2. 运行gdb a.out(或您的计划名称)。
  3. Google gdb cheatsheet,了解有关如何设置断点和单步执行代码的信息。