在上一次考试中遇到的问题,我需要帮助。
通过调用pX(7)编写以下方法的执行输出。
public static void pX(int x) {
if (x > 1) {
pX(x/2);
pX(x/2);
}
System.out.println(x);
}
当方法两次调用自身时,我不理解递归。
答案 0 :(得分:1)
递归是当方法或函数调用自身时。
Multiple Recursion是方法或函数包含多个自引用时。这是有点棘手的时候。让我们看一下您的示例。
您调用px(7)
,由于条件检查时参数超过了1
的值,它将进入该代码块并遇到第一个递归调用,将参数除以一半, px(7/2)
,其结果为px(3)
(四舍五入为整数)。
现在您已经输入了第一个递归呼叫,让您的原始呼叫搁置一秒钟,然后专注于px(3)
的新呼叫。您的条件确定x仍大于1,因此我们在此调用中遇到了 first 递归。因此,我们再次调用自己,将参数px(3/2)
除以一半,得出px(1)
(再次取整)。
现在我们的条件将不再通过,因此在此迭代中将没有递归调用,我们将直接转到System.out.println(x);
并打印出值1
返回到px(3/2)
的调用位置,这种情况下的下一行将再次执行。因此,我们再次调用px(3/2)
。
仍然,我们的条件不会通过,因此我们将不再调用任何递归调用,而直接转到System.out.println(x);
再次返回到第二个px(3/2)
的调用位置。我们已经完成了条件块,最终可以调用System.out.println(3);
这是输出中的前三行1,1,3
这可能有点棘手,但是您需要集中精力,留住并关注通话堆栈,才能真正解决问题。