在你开始之前,我已经无数次地使用谷歌,希望能找到一个非常简短的简单解释,当递归类型具有返回类型时递归是如何工作的。但我想我并不像我想的那么聪明,因为我仍然无法理解它。
以下面的代码片段(在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。
我只需要有人在我提供的方法中解释该过程的工作原理。也许一步一步的方法可以帮助我理解递归是如何工作的。
答案 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 iteration和recursion 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;
}
您正在根据自身定义未解决的问题,因为解决方案始终涉及基本情况或问题的简单版本(其本身)进一步涉及基本案例或更简单的问题版本。)
我将以我最喜欢的一个笑话结束:
你如何解释一个五岁的人的递归?
你解释一个四岁的人的递归,然后等一年。