是否存在将迭代解决方案转换为递归解决方案的通用公式?

时间:2016-10-27 02:36:38

标签: java recursion

我一直在努力实验,要求我将迭代解决方案变成递归解决方案。

我真的很难接受递归而且我明白了它,但我觉得必须有比试验和错误更好的方法。

我不是一个超级高级程序员,所以我不太好,但我很好奇是否有适合大多数时间的模具。

任何反馈意见。我最了解Java,所以如果它是Java的话,它真的会有所帮助!

3 个答案:

答案 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;
    }
}
相关问题