重学递归思想,体悟数据结构奥妙
说来好笑,暑假一腔热血想进acm,在学插入排序,归并排序这两个玩意,耗费了我整整一个星期都没搞懂,一度让我想放弃,觉得自己刚开始学算法就被打败了,不配coding了,后面请教别人,才发现里面有个递归思想我还不会,所以很痛苦。。。暑假结束了,递归我还没那么懂,今天来复仇了
先说说递归,本质上就是一个函数自己调用自己,为什么要自己调用自己,当然就是,你一直调用一个方法,肯定就是为了实现相同的一个目的,那你有事没事一直实现相同的目的干什么呢,谁去实现那个目的呢,为什么要去实现呢,这就是递归的精髓所在,递归存在的目的,就是为了用相同的方法,去往下一直处理相似的事物,这么说很抽象,比如说,我想遍历一个链表,那么我可以打印完a,接着再去打印a.next,可以把它叫做b,打印完b,再去打印b.next,接着就是c,d,e,f.....这就是相似的事物,比如说二分查找,我把一本500页的学生手册撕成250页,再把它的one half撕成 125页,接着再按照规律一直撕一直撕。。。。最后撕完了,这个可以叫做递归自己的子集,把事情化简
看看这个玩意,sout里面一个after,一个before,before那边,会正向遍历链条,after那边反之,为什么呢,这就是递归的魅力了,先说说简单的before,很好理解,就是自己调用自己,先打印完自己,再调用下一个接着打印,直到结束,而after那一块,就是困扰我很久很久的点。。。,如下图
这就是一个递归中重要的2内层函数与外层函数的思想,就是你内层运行完了,你外层才能接着往下走,如图所示,打印完after3,内层3运行结束,内层2接着往下走打印after2,内层2运行结束,内层1.。。