递归,怎么说呢?
递归在我们日常的编程中还是比较有用的,虽然用的不多,但却是比较实用的。
下面来看看递归的2个条件。
1:自身的调用,这也是递归最为核心的思想,自己调用自己。
2:出口,每一个递归都是有出口的,没有出口的递归和死循环有什么区别?对吧,你不论是for,while循环。都需要出口。不然就死循环了。
递归最常见的例子就是累加或者阶乘。
下面举个累加的例子:
下面来看这个例子,方法line9-14是递归方法,整个方法也很简单。、
line9:没什么好讲的,就参数,to,表示从1开始加,加到加到什么时候为止。
line10-11,判断加出口,如果是1的时候,就跳出,并返回1
line13:调用自身。
下面来看看整个方法的执行过程
第一次:accumulation(5),执行的结果是:5+accumulation(4),这点毫无疑问。
接下来第二次:accumulation(4),执行的结果是4+accumulation(3),
第三次:accumulation(3),执行的结果是3+accumulation(2),
第三次:accumulation(2),执行的结果是2+accumulation(1),
最后一次:accumulation(1),执行的结果是1;
以上没错吧,没错就可以了,接下来往下看:
第一次执行的结果得到的算式是这样的:5+accumulation(4),
第二次执行的结果得到的算式是这样的:5+(4+accumulation(3)),
第三次执行的结果得到的算式是这样的:5+(4+(3+accumulation(2))),
第四次执行的结果得到的算式是这样的:5+(4+(3+(2+accumulation(1)))),
最后得到的算式是这样的:5+(4+(3+(2+1)))
最后运算这则算式,得到结果。
上面有一点很重要的:最后才加,前面并不会计算。也就是说,第二次执行的结果并不是9+accumulation(3),(同样的道理:最后得到的算式也不是:(((5+4)+3)+2)+1)这点很重要,这点都没回过头来的话,递归就白学了,这点都没搞清楚的话你跟我说你懂递归?笑话。
有些人会说了,我先加,最后还不是得到一样的结果?笑话,你这是累加,这个算式中。你按照上面去写两个算式,算出来结果是一样的,于是你又去给我写了一个阶乘,结果阶乘的结果也是一样的,如果到这里你还没搞清楚就可以回家了,阶乘最后是不是跟累加一样,还是一样的结果,你这不是笑话么?能不能出点新的花样?
为了证明我上面所说的是对的,下面来看这个例子:
先来解释一下这个例子:计算的规则是这样的,N 为偶数的时候:F(n)=n*F(n-1);N 为奇数的时候:F(n)=n+F(n-1);最后F(1)=1;
这个例子:如果按照我上面说的,得到的算式是这样子的:5+(4*(3+(2*1)))= ??
如果按照错误的方式算的话,得到的算式也就是:(((5+4)*3)+2)*1 = ??
上面这两个算式,自己去算一下!
然后自己再看一下最后的打印结果,是和第一个还是和第二个一样?
醒醒,到现在清楚了吧!
清楚就自己去写个递归吧,实践永远是学习最好的方式,但要注意的是:实践不是让你把我这代码写一遍,我这代码是毫无意义的,当然没事有时间也是可以先写一边这个代码,哈哈!
给你们出一题吧:还是累加,但跟我这个不一样的是,我这个从5开始加,你自己没事尝试一下从1开始加,也就是最后得到的算式是1+(2+(3+(4+5)))
哈哈,去写吧,还有一个比较好的例子,还是累加,我这个累加是从1开始的,可以尝试一下写从指定开始和结束的位置,例如,我要从3累加到10,一个小程序是不是变活了,已经不在是死程序了,写完还可以尝试一下这个例子,还是和上面一样,如果你写的是从3加到10的,你可以尝试一下从10加到3,哈哈,别晕。写完自己没事可以写一下循环遍历文件并删除(注意哈:不要把自己有用的文件删除了,没事自己先建一个文件夹,里面放些垃圾文件,再搞几个文件夹,里面再放些文件夹和文件就差不多了)不要到时候怨恨老夫把你的文件给删除了!哈哈!
line:11-16:是这个的-->1+(2+(3+(4+5))) (这里参数名字改为from应该好理解一点,直接修改原方法,没注意参数名字了,此外,这里的to应该传1,而不是传5)
line:18-27 和 line:29-38 就是从指定从哪里开始加到哪里,不要问我为什么前面(line19和line31)还要判断一下,自己想,用脚趾头都能想明白!
递归就写到这里,我也还是小菜鸟一枚,有什么不对或者有改进的地方,望各位网友指点一二!谢谢!