Recursion 将while/for循环转化为递归背后的大想法/策略?什么时候可以/不可以转换?

Recursion 将while/for循环转化为递归背后的大想法/策略?什么时候可以/不可以转换?,recursion,Recursion,我已经编写(简单的)代码有一段时间了,我觉得我对while和for循环以及if/else语句有点牢牢的把握。我还应该说,我觉得我理解(至少在我的层次上)递归的概念。也就是说,我理解一个方法如何不断地调用自己,直到迭代的参数与方法中的基本情况匹配为止,在这一点上,方法开始终止并将控制(连同值)传递给以前的实例,最终确定第一次调用的总值。我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例。但我的问题是在野外创建递归方法,即在非结构化环境中 我们的教授希望我们抓住每一个机会

我已经编写(简单的)代码有一段时间了,我觉得我对while和for循环以及if/else语句有点牢牢的把握。我还应该说,我觉得我理解(至少在我的层次上)递归的概念。也就是说,我理解一个方法如何不断地调用自己,直到迭代的参数与方法中的基本情况匹配为止,在这一点上,方法开始终止并将控制(连同值)传递给以前的实例,最终确定第一次调用的总值。我可能解释得不是很好,但我想我理解它,并且我可以跟踪/跟踪我所看到的结构化示例。但我的问题是在野外创建递归方法,即在非结构化环境中

我们的教授希望我们抓住每一个机会以递归方式编写,并提出了(技术上不准确?)所有循环都可以用递归替换的说法。但是,由于很多时候递归操作都包含在while或for循环中,这意味着,显而易见,并不是每个循环都可以用递归代替。所以

对于非结构化/非课堂情况

1) 如何识别循环情况可以/不能转化为递归,以及

2) 在将递归应用于某个情况时,使用的总体思想/策略是什么?我是说,我该如何处理这个问题?问题的哪些方面将被用作递归标准等

谢谢

编辑6/29:

虽然我很欣赏这两个答案,但我认为我的问题的序言可能太长了,因为它似乎得到了所有的关注。我真正想要的是有人和我分享,一个在循环中“思考”的人,一种实现递归解决方案的方法。(出于问题的目的,请假设我对解决方案有足够的了解,但只需要创建递归代码。)换句话说,要应用递归解决方案,我在问题/解决方案中寻找什么,然后将用于递归?也许关于应用递归的一些非常一般的陈述也会有所帮助。(注意:请不要使用递归的定义,因为我认为我非常理解递归的定义。我只是想问一下应用递归的过程。)谢谢

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);