已为我提供了有关递归的示例练习。总体上,我能够完美地跟踪递归方法,但是有一种递归方法存在跟踪问题。
static int fg(int x) {
if (x < 5) {
return x * x + 1;
}
if (x == 5) {
return x * x - 3;
}
return fg(x - 2);
}
我通常会知道如何通过此代码进行跟踪,但问题是“从方法调用fg(fg(fg(fg(3)))返回什么值?”
您是否有关于如何通过这种方法调用来跟踪此代码的想法?谢谢。
答案 0 :(得分:0)
只需考虑每个函数分别调用函数。 步骤1:首先是fg(3)=>这将返回3 * 3 +1 = 10 步骤2:下一个fg(10)=>不满足与5相关的条件,控制转到最后一条语句返回fg(10-2) 因此fg(8)=> fg(6)=> fg(4); 现在4满足第一个条件;返回4 * 4 +1 = 17; 步骤3:现在最后一个片段fg(17);与步骤2相似,此数字递归减少2,直到小于或等于5以满足前两个if块之一; fg(17)=> fg(15)=> fg(13)=> fg(11)=> fg(9)=> fg(7)=> fg(5) 现在是5,如果满足块,则为第二;因此返回5 * 5-3 = 22;
这是您的最终答案!
答案 1 :(得分:0)
原始方法名称未作为参数传递。参数被声明为int
,并且方法名称和方法引用都不是int
。而是调用最内部的方法fg(3)
,其返回值成为周围调用的参数,然后其返回值成为最外部调用的参数。
认为它等同于:
int first = fg(3);
int second = fg(first);
int answer = fg(second);
仅不包含临时变量。