先说答案,这是肯定的,所有递归代码都可以转为非递归代码。
之所以所有的递归都能转为迭代算法是因为递归借助函数调用,函数调用本身就是基于调用栈这种结构实现的,只不过这一切都是自动完成的,我们当然也可以用代码手动模拟出来。
我们知道将递归调用全部展开后其实会形成一棵树,把递归转为非递归无非就是在遍历这棵树,那么遍历树就有很多技术了,基于栈的深度优先遍历Depth-first traversal,或者基于队列的广度优先遍历breadth-first traversal都是可以的:
说会递归转为非递归这个话题,更理论一些的解释是这样的,不管是递归还是非递归,这两者都是图灵完备的,既然是图灵完备,那么它们在表达能力上就是等价的,不存在谁不能转为谁的问题。
只不过这存在一个难易程度的问题。
大家都知道尾递归最容易转为非递归的迭代形式,本质上是这棵树不是多叉的而是单叉的,单叉的不就退化成链表了嘛,遍历链表当然是简单的,但如果是多叉的话问题就没那么简单了, 这里最有趣的是不存在一种模板可以让我们直接用套路的形式把递归转为非递归 ,因此这里存在一个问题:为什么你要把递归转为非递归呢?因为最终你会发现将递归转为非递归无非就是你自己接手了编译器本来已经替你完成的工作, 你会发现自己在手动模拟函数调用 。
递归的优势很明显:代码简洁,容易理解和维护,其为人诟病的地方在于执行效率“可能”没有非递归版本的高,但你最好理解这句话到底在说什么,到底哪里效率就不高了?
-
结构
+关注
关注
1文章
119浏览量
22017 -
函数
+关注
关注
3文章
4385浏览量
65164 -
递归
+关注
关注
0文章
29浏览量
9199
发布评论请先 登录
labview中递归使用你尝试过吗?
《C Primer Plus》读书笔记——递归
三个水桶等分8升水问题---用LabVIEW递归解题
LabVIEW递归
LabVIEW中的递归调用
LabVIEW中使用递归算法
递归算法的设计模式与调试
Labview初级教程之递归与可重入VI的详细资料说明

评论