我一直在努力实验,要求我将迭代解决方案变成递归解决方案。
我真的很难接受递归而且我明白了它,但我觉得必须有比试验和错误更好的方法。
我不是一个超级高级程序员,所以我不太好,但我很好奇是否有适合大多数时间的模具。
任何反馈意见。我最了解Java,所以如果它是Java的话,它真的会有所帮助!
答案 0 :(得分:1)
我不喜欢将迭代解决方案转换为递归解决方案的实验室。如果有迭代解决方案,通常最好只使用它。
但是,如果迭代解决方案让您在迭代之间保存了很多状态 - 很多状态 - 那么使用递归可能会更好。
我不知道这样做有任何“通用公式”。当我遇到一个可以分成较小的相同问题的问题时,我会考虑递归的可能性。
考虑对硬盘上的所有文件执行某些操作。你可以迭代地做到这一点,但很难想象你必须保存的所有状态,如果你想对每个文件夹做一些事情,它可能会变得笨拙。递归解决方案是“z:对于每个文件,执行x,对于每个文件夹,执行y和z(或z和y)”。
将此与阶乘对比 - 您可以使用递归进行阶乘,但迭代解决方案非常简单,我讨厌看到它甚至用作示例。不过,我认为,从概念上讲,这是另一个由较小的相同问题组成的问题。
不知道这是否有任何帮助,但这就是我的想法。
答案 1 :(得分:0)
通常,迭代解决方案可以简化为以下格式:
function iterative(information):
while (condition) do
modify information
end while
return some value
end function
可以通过重新排列代码将其更改为递归函数,格式为:
function recursive(information):
if(condition) then
modify information
recursive(information)
else
return some value
end if
end function
请记住,这是一个非常通用的公式,你仍然需要在一些(大多数)问题上做很多工作。
最后注意:迭代解决方案通常是最好的方法。使用递归在内存上更糟糕,并且通常在性能上更差。它几乎专门用于使更容易阅读,理解或实现的东西(深度优先搜索是一个非常好的例子,查看它的迭代和递归算法)。在学校学习这些东西时尽量记住这一点,仅仅因为你被教导一件事并不意味着它是最好的方法,确保为自己做额外的研究和测试。
答案 2 :(得分:0)
在我看来,如果存在一个问题,你应该只使用递归,你可以应用一组特定的操作,使问题在功能上相同但更小。
计算你的硬盘上的文件,你可以迭代地进行,但它非常麻烦。但是,您可以应用一组操作来解决问题,使问题在功能上相同但更小:您可以只计算当前目录的文件并添加子目录的计数。
一般来说,如果你能用这样的术语描述你的问题:
function fixTheProblem(thingToFix) {
if (problemCanBeFixedDirectly) // IE no more subdirectories
return calculateProblemResult(); // IE Count files in current directory
else {
var result = calculateSmallSubProblem(); // IE count files in current
var smallerButSimilarProblems = breakupProblem(); // IE take subdirecties
foreach (var smallerProblem in smallerButSimilarProblems) {
var intermediateResult = fixTheProblem(smallerProblem);
result += intermediateResult;
}
return result;
}
}