Car*_*org 39
当您以递归方式使用函数时,编译器会为您处理堆栈管理,这使得递归成为可能.你可以递归地执行任何操作,你可以通过自己管理堆栈来做(对于间接递归,你只需要确保你的不同函数共享该堆栈).
所以,不,没有什么可以通过递归来完成,并且不能通过循环和堆栈来完成.
Too*_*the 15
可以使任何递归函数迭代(进入循环),但您需要自己使用堆栈来保持状态.
通常,尾递归很容易转换为循环:
A(x) {
if x<0 return 0;
return something(x) + A(x-1)
}
Run Code Online (Sandbox Code Playgroud)
可以翻译成:
A(x) {
temp = 0;
for i in 0..x {
temp = temp + something(i);
}
return temp;
}
Run Code Online (Sandbox Code Playgroud)
可以转换为尾递归的其他类型的递归也很容易改变.另一个需要更多的工作.
下列:
treeSum(tree) {
if tree=nil then 0
else tree.value + treeSum(tree.left) + treeSum(tree.right);
}
Run Code Online (Sandbox Code Playgroud)
翻译不是那么容易.您可以删除一个递归,但如果没有一个结构来保持状态,则另一个递归是不可能的.
treeSum(tree) {
walk = tree;
temp = 0;
while walk != nil {
temp = temp + walk.value + treeSum(walk.right);
walk = walk.left;
}
}
Run Code Online (Sandbox Code Playgroud)
问题不在于它们不能用循环来实现,而是递归算法的工作方式,它更清晰,更简洁(在许多情况下在数学上可证明)函数是正确的.
许多递归函数可以写成尾循环递归,可以优化为循环,但这取决于算法和使用的语言.