2016-03-07 79 views
2

我只是介绍了递归和我得到了下面的代码行:递归输出

public class RecursionThree 
{ 
    public void run(int x) 
    { 
     if(x<5) 
     run(x+1); 
     out.println(x); 
    } 
    public static void main(String args[] ) 
    { 
     RecursionThree test = new RecursionThree(); 
     test.run(1); 
    } 
} 

和输出应该是:5 4 3 2 1,我得到它为什么会打印5(因为5 <将等于false,它会打印x,即5)。但是,我不明白为什么它会打印4 3 2 1。感谢您的帮助

+0

你的输出应该是'1 2 3 4 5',每个都在一个新行中。作为一个概念的递归可以被看作是让摄像机具有分离(实时)屏幕,其镜头指向其屏幕,其反过来显示屏幕及其图像在原始图像的屏幕内不断重复,除了每次较小。就像你的情况一样。你的方法'run()'一次又一次地调用'run()',每次给它一个**更大的**号码直到满足条件(在这种情况下,直到数字是5)。 – shrmn

+0

输出是5 4 3 2 1,每个都在一个新行(我运行代码),但我想我现在得到它,谢谢 – JavaB

+2

@shrmn输出不能是'1 2 3 4 5'。递归阶段之后,而不是之前完成打印。这与你所说的“5 4 3 2 1”完全相反。发帖前请检查。 –

回答

2

递归的工作原理是分解到基本情况并向后建立。在你的情况。您的基本情况是x>=5,它将停止扩展递归树的位置,您可以将基本情况视为树的末尾或叶。之后,它回到完成在运行被调用之后要完成的事情。所以在你的情况下,每次调用一次后,它就会打印出x。

当x = 1时,它调用run(2),在解析run(2)后,它会转到下一行。运行(2)后,打印输出为5 4 3 2,然后打印出x返回原来的电话run(1),这将是1。这对遍历树等非常好,还有很多其他问题。

图片它,当你调用运行(1)

run(1) 
1<5 
    run(2) 
    2<5 
    run(3) 
    3<5 
     run(4) 
     4<5 
     run(5) 
      print(5) 
     print(4) 
    print(3) 
    print(2) 
print(1) 

正如你可以看到它去的基本情况,并备份。

要熟悉递归更多,你可以这样做的问题,找到最大的INT与方法头数组是public int findLargest(int [] array, int someNumber),你会用someNumber,无论你认为你需要。或者使用递归和一个参数来反转字符串。

+0

非常感谢,这帮了很多 – JavaB

+1

很高兴帮助。你有关于递归的其他问题吗? –

+0

还没有,非常感谢你! – JavaB

2

对于您的x=4的情况,run(5)被调用。在完成运行后,控制返回到被调用函数,其中x现在为4.因此,它在执行if后面的行处打印出4.对于x = 3,2,1,遵循相同的逻辑。

+0

如果它显示“system.out.println(x)”并且x是5,是不是会打印5,然后停止,因为“run”中没有其他内容?我仍然不明白它为什么会一直回归,而且我到处都在寻找,我无法得到一个清晰的解释。它是否打印“4,3,2,1”,因为这些是以前的x值,在某些方面递归存储这些值?希望你能帮助我,并感谢您的帮助 – JavaB

+2

@JavaB非常。如果你注意到,'run(x + 1)'被调用iff'x <5'。因此,对于x = 5的情况,不会调用run(6)。所以,我们不必担心这一点。对于x = 5的情况,在检查if条件之后,打印5。现在,我们完成了x = 5情况下的函数实例。时间回到x = 4的情况。该案例已经过评估。之后的行要求将4打印到控制台。现在,我们完成x = 4情况下的函数实例。现在x = 3的情况..... –

+0

@JavaB这是否回答你的问题? –