Java 我需要帮助才能完全理解递归的概念

Java 我需要帮助才能完全理解递归的概念,java,recursion,Java,Recursion,在您开始之前,我已经无数次使用google,希望搜索一个非常简短且简单的解释,当递归具有返回类型时,它是如何工作的。但我想我并不像我想的那么聪明,因为我仍然不能很好地理解它 以下面的代码片段(java)为例 public static int recursion(int num) { int result; if (num == 1) result = 1; else result = recursion(num - 1) + num;

在您开始之前,我已经无数次使用google,希望搜索一个非常简短且简单的解释,当递归具有返回类型时,它是如何工作的。但我想我并不像我想的那么聪明,因为我仍然不能很好地理解它

以下面的代码片段(java)为例

public static int recursion(int num)
{  
 int result;   

if (num == 1)
    result = 1;

else           
     result = recursion(num - 1) + num; 

return result;

} 
我从我的教授讲课幻灯片上抓取了这段代码,他说这将返回1+2+3+…+num

我只需要有人解释我提供的方法是如何工作的。也许一个循序渐进的方法可以帮助我理解递归是如何工作的。

递归(5)=递归(4)+5,让我们找出递归(4),稍后再讨论这个问题

递归(4)=递归(3)+4,让我们算出递归(3),稍后再讨论这个问题

递归(3)=递归(2)+3

递归(2)=递归(1)+2

递归(1)=1,我们知道这一点

递归(2)=1+2,现在我们可以计算它

递归(3)=(1+2)+3,现在我们可以计算它

递归(4)=(1+2+3)+4

递归(5)=(1+2+3+4)+5,我们原来问题的答案


注意:在不知道递归(1)的情况下,我们会一直使用0、-1、-2,依此类推,直到永远。这个已知量称为基本情况,它是递归的一个要求

基本上是在上一次迭代之后创建的每个项目都有一个堆栈。(其中num=1)

当n>1时,if语句将迭代踢到else,后者将结果“保存”到堆栈中,并使用n-1再次调用相同的函数


有效的做法是一直调用相同的函数,直到达到指定的“基本情况”,即n=1,与您发布的经典代码示例相同。如果您像这样调用方法,并将数字作为5传入:

recursion(5);
通俗地说,您的函数将在else块中创建并调用函数的另一个副本,如下所示:

recursion(4);
然后

recursion(3);
recursion(2);
recursion(1);
随着数字不断减少

最后,它将调用方法最终副本中的if部分,因为num将满足
num==1
。因此,它从那里开始展开&将每个值返回到上一个调用

由于每个方法调用都有自己的堆栈来加载方法局部变量,因此将为n个调用创建n个堆栈。当进行递归中最深的调用时,堆栈开始展开因此实现了递归

然而,需要注意的最重要的一点是,代码中有一个基本的most调用,它是在
1
处完成的,因为您有检查
if(num==1)
。否则它将是无限递归&当然,编写一个致命的错误程序。最基本的调用是从递归术语中称为堆栈展开的地方开始的

示例:查找数字的阶乘是递归的最经典示例


性能:一定要深入研究递归对性能的影响

递归就是通过将问题分解成更小的问题来解决问题。在您的案例中,问题是“如何将1到n的数字相加”,答案是“将1到n-1的所有数字相加,然后将n相加”。你已经用一个更小或更简单的版本来描述这个问题。这通常需要分离出一个“基本情况”——一个不可简化的简单问题,并给出一个直截了当的答案

public static int recursion(int num)
{  
 int result;   

if (num == 1)
    result = 1;   // Base case: the sum of the numbers from 1 to 1 is 1.

else           
     result =
         // This is the sum of numers from 1 to n-1. The function calls itself.
         recursion(num - 1)
         // Now add the final number in the list, and return your result.
         + num; 

return result;

}
您是根据问题本身来定义未解决的问题,这是因为解决方案总是涉及基本情况或问题的更简单版本(其本身进一步涉及基本情况或问题的更简单版本)

我将以我最喜欢的一个笑话作为结束:

你如何向一个五岁的孩子解释递归

你向一个四岁的孩子解释递归,然后等一年


检查这个问题,它应该会有帮助;)小贴士:当你的教授介绍一些概念时,问他你不懂什么。总是。他们会帮助你,所以如果你不理解,你需要让他们再次解释这个概念。关于你的代码,我认为一步一步地调试它会使它变得非常简单。@Persixty-玩得很好!我能做的最好的事情就是建议在插入一些具体数字时写出函数中每个变量的计算结果。比如说,您从调用
intresult=recursion(4)
开始。用铅笔和纸写出执行结果,直到返回最终值为止。我想回答你的问题会有帮助。要理解递归,你需要理解递归。但是对于这个特定的例子,请看一看。逐步调试,这是理解某些代码如何工作的最有效的方法。太神了非常感谢你,这真的是最有用的答案