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

问题描述 投票:0回答:2

我已经接受过递归的样本练习。我总体上可以完美地跟踪递归方法,但是有一个递归方法,我有一个问题跟踪。

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

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

java recursion
2个回答
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,以满足前2个if块中的任何一个; fg(17)=> fg(15)=> fg(13)=> fg(11)=> fg(9)=> fg(7)=> fg(5)现在,如果满足块则为5;因此返回5 * 5 - 3 = 22;

那是你的最终答案!


0
投票

原始方法名称不作为参数传递。该参数被声明为int,方法名称和方法引用都不是int。相反,调用最内部的方法fg(3),并且其返回值成为周围调用的参数,其返回值则成为最外部调用的参数。

把它想象成等同于:

int first = fg(3);
int second = fg(first);
int answer = fg(second);

只有没有临时变量。

© www.soinside.com 2019 - 2024. All rights reserved.