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

时间:2017-05-18 18:45:31

标签: java recursion

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

以下面的代码片段(在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。

我只需要有人在我提供的方法中解释该过程的工作原理。也许一步一步的方法可以帮助我理解递归是如何工作的。

4 个答案:

答案 0 :(得分:8)

recursion(5)= recursion(4)+ 5,让我们弄清楚递归(4)并稍后再回来

recursion(4)= recursion(3)+ 4,让我们弄清楚递归(3)并稍后再回来

recursion(3)= recursion(2)+ 3,...

recursion(2)= recursion(1)+ 2,...

recursion(1)= 1,我们知道这个!

recursion(2)= 1 + 2,现在我们可以评估这个

递归(3)=(1 + 2)+ 3,现在我们可以评估这个

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

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

注意:如果没有知道递归(1),我们已经转到0,-1,-2等等,直到永远。此已知数量称为基本情况,它是递归的必要条件。

答案 1 :(得分:0)

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

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

这实际上做的是继续调用相同的函数,直到你达到指定的'基本情况'为n = 1

答案 2 :(得分:0)

使用您发布的经典代码示例。如果你把你的方法称为5:

传入你的方法
recursion(5);

以外行人的名义来理解,你的功能将创造&在else块中调用您函数的另一个副本,如下所示:

recursion(4);

然后

recursion(3);
recursion(2);
recursion(1);

随着数字的不断减少。

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

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

但最值得注意的是,您的代码中存在最基本的调用,这是在1完成的,因为您拥有支票if (num == 1)。否则它将是无限递归&当然是一个致命的&错误的程序写。最基本的调用是从递归术语中称为堆栈展开的地方。

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

效果:请查看recursion vs iterationrecursion vs looping以了解递归对性能的影响

答案 3 :(得分:0)

递归就是通过将问题分解为更小的问题来解决问题。在你的情况下,问题是“你如何将数字从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;

}

您正在根据自身定义未解决的问题,因为解决方案始终涉及基本情况问题的简单版本(其本身)进一步涉及基本案例或更简单的问题版本。)

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

  

你如何解释一个五岁的人的递归?

     

你解释一个四岁的人的递归,然后等一年。