大家好,欢迎来到IT知识分享网。
递归总结为一句话就是:“自己调用自己,在满足某个条件后停止这一过程”。
Caldwell在Stack Overflow上说的一句话:“如果使用循环,程序性能可能更高;如果使用递归,程序可能更容易理解;如何选择要看什么对你来说更重要”。
(下面我们一起来探讨这个问题)
给你一个手提箱,里面装有3个大盒子,像俄罗斯套娃一样,3个大盒子里都可能还套着一个小盒子(小盒子里可能还套着更小的盒子),钥匙就放在某个盒子里,为了找到这把钥匙,你将怎么做?
第一种方式:
1.把手提箱里所有的盒子拿出来,放在一张桌子上(创建盒子堆)。
2.依次打开三个盒子。
3.打开如果里面是钥匙,则大功告成。如果还是盒子,就从大盒子里把小盒子拿出来,放在桌子上,用力把大盒子一脚踢的远远的(保持桌子上永远只有三个盒子)
一直打开桌子上剩余的盒子,找到钥匙!
第二种方式:
1.从手提箱里拿出一个盒子。
2.打开它,如果是盒子就继续打开,直到找到钥匙,否则就一直开,直到空了,然后再从手提箱里换另一个盒子。
一直重复步骤,找到钥匙!
方式一用代码表示:
就是嵌套双层循环,while循环的条件是桌子上还有盒子就一直执行。内部循环用于遍历桌子上的三个盒子,依次打开检查。
方式二用代码表示:
这两种代码作用目的相同,但在我看来第二种则更清晰。递归只能让方案更清晰,性能上不见得有优势,反而有的场景下,循环的效率高于递归。很多算法都使用了递归,因此理解这个概念,对算法的学习是必不可少的。
由于是自己调用自己,编写这种逻辑时很容易进入死循环,举个例子:
假如你要编写一个倒计时从3开始依次减1
3……2……1
如果没有在等于1时停止调用,则会一直运行下去,直到死机。
3……2……1……0……-1……-2……
如何避免这个问题?
那就记得实现递归函数,姐弟(基递)条件不能少。
基线条件和递归条件要同时存在。
递归条件就是指函数调用自己。基线条件则是指函数不再调用自己。
这些内容都来自于近期再读的一本书《算法图解》后做的一些整理归纳。
null
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/91111.html