这个问题主要集中在算法上,也许是抽象的并且更学术化。
这个例子提供了一个想法,我想用一种通用的方式,所以例子仅用于使我们更清楚地了解您的想法。
一般来说,循环可以转换为递归的。
例如:
for(int i=1;i<=100;++i){sum+=i;}
其相关的递归为:
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
最后,为了简化此过程,需要执行尾递归:
int GetTotal (int number, int sum)
{
if(number==1) return sum;
return GetTotal(number-1,sum+number);
}
但是,大多数情况下都不容易回答和分析。我想知道的是:
1)我们能否获得一种“通用方式”将循环(for / while……)转换为递归?在进行转换时,我们应该注意哪些事情?最好写一些示例的详细信息以及您的persudo理论以及转换过程。
2)“递归”具有两种形式:线性递归和尾递归。那么哪个转换更好呢?我们应该掌握什么“规则”?
3)有时我们需要保留递归的“历史”,这很容易在循环语句中完成:
例如:
List<string> history = new List<string>();
int sum=0;
for (int i=1;i<=100;++i)
{
if(i==1) history.Add(i.ToString()+"'s result is:1.");
else
{
StringBuilder sub = new StringBuilder();
for(int j=1;j<=i;++j)
{
if(j==i) sbu.Append(j.ToString());
else
{
sub.Append(j.ToString()+"+");
}
}
sum +=i;
sbu.Append("'s result is:"+sum+Environment.NewLine);
}
}
结果如下:
1的结果是1。
1 + 2的结果是3。
1 + 2 + 3的结果是6…………
但是,我认为很难将历史保持在递归状态,因为基于递归的算法着重于获取最后的结果并进行回调。因此,所有这些操作都是通过由编程语言维护的堆栈来完成的,该语言由堆栈自动分配内存。以及我们如何“手动”取出每个“堆栈值”并通过递归算法返回多个值?
那么“从递归算法到循环”又如何呢?它们可以彼此转换吗(我认为应该从理论上完成,但是我想要更准确的方法来证明我的想法)。