递归的优点是什么?
某些编程语言可以优化尾部递归,但是,总的来说,递归比常规循环消耗更多的资源。
是否可以具有某些递归函数的迭代版本?
递归的优点是什么?
某些编程语言可以优化尾部递归,但是,总的来说,递归比常规循环消耗更多的资源。
是否可以具有某些递归函数的迭代版本?
Answers:
是的,您可以将递归函数编码为迭代。基本上,您需要手动维护信息,否则编译器生成的方法调用代码会处理这些信息。
换句话说,您需要一个堆栈,其中每个条目都是一个包含传递的参数和所有局部变量的结构。您始终在堆栈中最顶层的条目上工作。如果您需要自称,请创建一个新条目并将其放在堆栈顶部。完成后,拿出堆栈中最顶层的条目以显示下面的内容,并使用先前最顶层的条目提取返回值并相应地更新新的最顶层的条目。
我建议您阅读一本编译器书,以了解通常如何在机器代码中实现这一点。
递归通常是一种比迭代更自然的看待事物的方式。例如,考虑对二叉树进行有序遍历: inorder(left); process(); inorder(right);
比显式维护堆栈要简单得多。
只要您不做得太深(炸毁堆栈),资源使用的差异通常就很小。通常不用担心。尽管有例外,但是简单代码通常比手动优化代码更好。正确通常比快速好。
任何递归算法都可以表示为迭代算法,但是您可能需要保留一个显式堆栈(与隐式处理的调用堆栈相对应)。毕竟,如果您编译了一个递归函数,您将获得依赖于操作堆栈和循环遍历该函数的东西,并且这是迭代的。
尾递归函数可以轻松地转换为循环,并且不需要堆栈,但这是一种特殊情况。
递归的优点是什么?
简单。如果没有尾部调用优化,那么它当然会占用更多资源(堆栈),但是,例如,如何deltree
在Java中实现而无需递归呢?delete()
唯一的问题是,只有在目录为空时才可以删除目录。这是递归的:
deltree(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
for (File subFileOrDirectory : fileOrDirectory.listFiles()) {
deltree(subFileOrDirectory);
}
}
fileOrDirectory.delete();
}