Java在没有任何返回语句的情况下运行递归?

Java在没有任何返回语句的情况下运行递归?,java,recursion,Java,Recursion,请解释递归方法的工作原理? 这意味着调用堆栈的工作 class rec { public static void func(int i) { if (i>=1) { System.out.println(i); func(i-1); System.out.println(i); } } public static void main(St

请解释递归方法的工作原理? 这意味着调用堆栈的工作

class rec
{
    public static void func(int i)
    {
        if (i>=1)
        {
            System.out.println(i);
            func(i-1);
            System.out.println(i);
        }
    }

    public static void main(String args[])
    {
        func(5);
    }
}

这种递归可以在不进入无限“循环”的情况下运行,因为在每次递归调用中,
i
值都会减小——一个更大的问题会分解为更小的问题,直到最终解决为止

首先传入5,它满足条件,进行另一个递归调用:

func(5) --> func(4)
您传入4,它满足条件,进行另一个递归调用,依此类推:

func(5) --> func(4) --> func(3) --> func(2) --> func(1)
当一个方法完成它的任务时,它返回到调用点,因此您开始从堆栈中弹出

print(1) --> print(2) --> print(3) --> print(4) --> print(5) --> back to main().
如果更正错误,则可以运行,并将产生以下结果:

5
4
3
2
1
1
2
3
4
5

回复您的评论:它可以显示
5432112345
,因为您在方法中执行了
System.out.println
!打印这些数字不需要返回值。

我给你做了一张流程图,让你能很好地理解,我给出了输入4

下面是所有的代码,但您必须知道,最后有一个return语句,如果您不编写return,您完全可以理解它

    public static void main(String[] args) {
    func(3);
}

public static void func(int i) {
    if (i >= 1) {
        System.out.println(i);
        func(i - 1);
        System.out.println(i);
    }
    return;
}

首先,你的代码甚至没有编译,这是一些非常简单的代码。如果您不能理解这样一个简单的示例,您需要阅读Java教程。我建议您在调试器中逐步完成代码,您将能够看到每行代码的作用。我还建议您使用IDE的代码格式化程序。@PeterLawrey该编辑程序应该改进格式吗?在这种情况下,println语句可以帮助您了解该方法的工作方式。我会运行这段代码,看看它是做什么的,看看你是否能弄明白它在做什么。好的……这就是这个概念。当func(1)完全执行时,它会从堆栈中弹出,然后执行func(2),依此类推。正确的?THnx.@A.Pan否,在这种情况下,所有5个将不会弹出,直到它到达最后一个递归调用。最后一个递归方法完成任务后,它开始弹出。@A.Pan,还记得是谁调用了func(1)吗?func(2)说的对吗?因此它将返回到调用点func(2)。func(2)也完成了它的任务,所以返回调用点:func(3)。这时func(3)也完成了它的任务,因此返回到调用点:func(4)…等等,直到从堆栈中弹出所有内容。