如何使用原始方法名称作为参数传入来跟踪Java中的递归方法

时间:2019-02-23 18:14:22

标签: java recursion

已为我提供了有关递归的示例练习。总体上,我能够完美地跟踪递归方法,但是有一种递归方法存在跟踪问题。

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)))返回什么值?”

您是否有关于如何通过这种方法调用来跟踪此代码的想法?谢谢。

2 个答案:

答案 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);

仅不包含临时变量。