Recursion 将while/for循环转化为递归背后的大想法/策略?什么时候可以/不可以转换?
我已经编写(简单的)代码有一段时间了,我觉得我对while和for循环以及if/else语句有点牢牢的把握。我还应该说,我觉得我理解(至少在我的层次上)递归的概念。也就是说,我理解一个方法如何不断地调用自己,直到迭代的参数与方法中的基本情况匹配为止,在这一点上,方法开始终止并将控制(连同值)传递给以前的实例,最终确定第一次调用的总值。我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例。但我的问题是在野外创建递归方法,即在非结构化环境中 我们的教授希望我们抓住每一个机会以递归方式编写,并提出了(技术上不准确?)所有循环都可以用递归替换的说法。但是,由于很多时候递归操作都包含在while或for循环中,这意味着,显而易见,并不是每个循环都可以用递归代替。所以 对于非结构化/非课堂情况 1) 如何识别循环情况可以/不能转化为递归,以及 2) 在将递归应用于某个情况时,使用的总体思想/策略是什么?我是说,我该如何处理这个问题?问题的哪些方面将被用作递归标准等 谢谢 编辑6/29: 虽然我很欣赏这两个答案,但我认为我的问题的序言可能太长了,因为它似乎得到了所有的关注。我真正想要的是有人和我分享,一个在循环中“思考”的人,一种实现递归解决方案的方法。(出于问题的目的,请假设我对解决方案有足够的了解,但只需要创建递归代码。)换句话说,要应用递归解决方案,我在问题/解决方案中寻找什么,然后将用于递归?也许关于应用递归的一些非常一般的陈述也会有所帮助。(注意:请不要使用递归的定义,因为我认为我非常理解递归的定义。我只是想问一下应用递归的过程。)谢谢Recursion 将while/for循环转化为递归背后的大想法/策略?什么时候可以/不可以转换?,recursion,Recursion,我已经编写(简单的)代码有一段时间了,我觉得我对while和for循环以及if/else语句有点牢牢的把握。我还应该说,我觉得我理解(至少在我的层次上)递归的概念。也就是说,我理解一个方法如何不断地调用自己,直到迭代的参数与方法中的基本情况匹配为止,在这一点上,方法开始终止并将控制(连同值)传递给以前的实例,最终确定第一次调用的总值。我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例。但我的问题是在野外创建递归方法,即在非结构化环境中 我们的教授希望我们抓住每一个机会
for(int i=0;i<50;i++)
{
对于(int j=0;j<60;j++)
{
}
}
等于:
rec1(int i)
{
if(i < 50)
return;
rec2(0);
rec1(i+1);
}
rec2(int j)
{
if(j < 60)
return;
rec2(j + 1);
}
rec1(inti)
{
如果(i<50)
回来
rec2(0);
rec1(i+1);
}
rec2(int j)
{
如果(j<60)
回来
rec2(j+1);
}
每个循环都可以是递归的。相信你的教授,他是对的 for(int i=0;i<50;i++)
{
对于(int j=0;j<60;j++)
{
}
}
等于:
rec1(int i)
{
if(i < 50)
return;
rec2(0);
rec1(i+1);
}
rec2(int j)
{
if(j < 60)
return;
rec2(j + 1);
}
rec1(inti)
{
如果(i<50)
回来
rec2(0);
rec1(i+1);
}
rec2(int j)
{
如果(j<60)
回来
rec2(j+1);
}
每个循环都可以是递归的。相信你的教授,他是对的
我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例
这很酷,如果我很好地理解了你的解释,那么你认为递归的工作原理乍一看是正确的
我们的教授希望我们抓住每一个机会以递归方式编写,并提出了(技术上不准确?)所有循环都可以用递归替换的说法
这并不准确。这是事实。反过来也是可能的:每次使用递归函数时,都可以使用迭代重写这可能很难而且不直观(就像穿越一棵树),但这是可能的
如何识别循环可以/不能转换为递归
简单:
进行转换时使用的总体想法/策略是什么
不幸的是,没有这样的事。我的意思是,没有通用或通用的“解决所有问题”的方法,在解决特定问题时,你必须特别考虑每种情况。然而,有一件事可能会有所帮助。当从迭代算法转换为递归算法时,请考虑模式。仅以微小差异不断重复的部分到底有多长时间和位置
此外,如果您想要将递归算法转换为迭代算法,请考虑在硬件级别实现递归的最流行方法是使用(调用)堆栈。除了在求解可转换的算法时,比如心爱的阶乘函数或斐波那契函数,您总是可以考虑它在汇编程序中的外观,并创建一个显式堆栈。脏的,但有用
我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例
这很酷,如果我很好地理解了你的解释,那么你认为递归的工作原理乍一看是正确的
我们的教授希望我们抓住每一个机会以递归方式编写,并提出了(技术上不准确?)所有循环都可以用递归替换的说法
这并不准确。这是事实。反过来也是可能的:每次使用递归函数时,都可以使用迭代重写这可能很难而且不直观(就像穿越一棵树),但这是可能的
如何识别循环可以/不能转换为递归
简单:
进行转换时使用的总体想法/策略是什么
不幸的是,没有这样的事。我的意思是,没有通用或通用的“解决所有问题”的方法,在解决特定问题时,你必须特别考虑每种情况。然而,有一件事可能会有所帮助。当conv
1. x = initial value;
2. while (some condition on x) {
3. do something with x;
4. x = next value;
5. }
6. final action;
A. def Recursive(x) {
B. if (some condition on x) {
C. do something with x;
D. Recursive(next value);
E. }
F. else { # base case = where the recursion stops
G. final action;
H. }
I.
J. Recursive(initial value);