为什么要用递归而不用循环?

2022-08-08 17:50:01 +08:00
 huzhikuizainali
看了一下递归算法的介绍。感觉都可以用循环来实现。而且递归因为出栈入栈还要占用大量内存空间。可以自我调用的次数也有限。所以大部分递归算法 解决的问题为为什么不用循环来解决呢?难道在相同运算次数的前提下,递归算法比循环运算速度快?

另外有一种感觉。就是 C 语言也不想想象中那么“灵活”。比如当你在 C 语言使用递归算法。编译以后程序还是会“自动对内存进行出栈入栈”操作。你只要用了递归算法,内存就会这样被使用。你没得选。当然如果你编写的每一段代码如何使用内存都要自己掌控,那就成了汇编语言了。但是感觉递归算法的内存调用还是被 C 语言编译器“写死了”,不知道我这种看法对不对?
1808 次点击
所在节点    C++
10 条回复
AoEiuV020CN
2022-08-08 18:01:16 +08:00
“过早优化是万恶之源”
AoEiuV020CN
2022-08-08 18:05:28 +08:00
@AoEiuV020CN #1 当业务逻辑是递归时就应该写成递归,而不是循环,
如果在算法完成不再需要修改之后确认这里需要死扣那一点点性能,再考虑改成不影响算法的循环也不迟,
yedanten
2022-08-08 18:18:23 +08:00
“累死”程序员和“累死”机器的区别。有些解法递归好理解好写而已。如果可以的话,尽可能用循环
wxf666
2022-08-08 18:55:37 +08:00
你不用语言的栈来实现递归,那就用自己的栈来实现循环呗(除非可优化的尾递归)
billlee
2022-08-08 19:54:10 +08:00
很多算法用递归更容易理解,gcc 开 -O2 就有尾递归优化,不能尾递归的改成手动管理栈,复杂度和直接写递归也是一样的,只有常数因子的差别
huzhikuizainali
2022-08-08 22:37:56 +08:00
@wxf666 我现在看到递归的例子都是“重复”做某件事情。但是递归代码必然会引起内存入栈。难道利用循环“重复”做某件事情也会有内存进栈?
wxf666
2022-08-08 23:01:21 +08:00
@huzhikuizainali 单纯的循环不会进栈

或许,你可以试着,用循环去解决一些,原本用递归干的活儿

比如,写个走迷宫。
再如,用递归下降去解析个 json

可能写多几个,你就不爱用循环+自己维护的栈,去模拟语言实现好的递归了
wxf666
2022-08-08 23:04:39 +08:00
@huzhikuizainali 走迷宫用深度优先遍历啊
wxf666
2022-08-08 23:27:55 +08:00
@huzhikuizainali 我在想,会不会是你不明白,

同样是“重复”,为何有的用递归,有的用循环?

递归还有一系列入栈出栈操作,既占内存,又耗性能,这货存在意义是什么?!
huzhikuizainali
2022-08-09 08:26:29 +08:00
@wxf666 对。就是不明白这一点。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871482

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX