写在前面的话:此文是我“研究”递归算法的整个思路历程,所以,“废话”有点多,大家自行提取重要信息哦~
说起递归,大家第一反应,不就是方法自己调用自己,多简单的一句话,但是,当你第一次,有着有循环为什么还有递归这东西的时候,说明你准备去百度,这两者的区别了,于是,百度上大量的累加的递归算法,浮现在你眼前,你copy下来,Run起来,结果正确,完美,你以为一切都如此简单,为所谓胜利后的“小确幸”而沾沾自喜,于是,你高高兴兴打下断点,来调式一遍递归,于是,可怕的事情来了;
static int Sum(int n)
{
if (n <= 1)
return n;
return n+Sum(n - 1);
}
上面,就是累加递归的算法,你要累加到n值的结果,比如,传n=100,那么,结果就是:5050
如上代码,return n+Sum(n - 1);,n-1(也就是下一次循环的参数n)迟早会满足if (n <= 1),而进行return n;这个时候,你是否想说,那结果不就是1了么,那为什么输出最后是5050呢(当n=100时),这个时候,你感觉你的代码脱离了自己的掌控,于是你慢慢的按下F11,咦,为什么断点还在方法内部,没有真正的return,看一下n值,发现变成2了,你怀疑的再按一下,再按一下,疯狂的按吧,但是连续按了七八次,你还是不耐烦的按了一下F5,乖乖,5050,赫然显示在屏幕前方,见“鬼”了;于是,你开始想办法理清递归原理,当你有这个想法的时候,说明你有了程序员的基本素质(在下作为行业新人,这么说真的好么,哈哈)——求知欲;于是,你想起刚才的那一幕“鬼打墙”,这个方法到底执行了多少次,100循环到1,又从1到100,于是,便有了这段代码:
static int count = 0;
static int Sum(int n)
{
count++;
if (n <= 1)
return n;
return n+Sum(n - 1);
}
重点来了,你疑惑得看一下count的输出值,没错,就是:100,它只执行了100遍,那为什么调式的时候,从100到1,又从1到100呢?
在100到1的过程中:是在进行遍历要加的值:100,99,98·····
在1到100的过程中:是在return从100到1的过程中的所有的Sum(n);同时进行累加操作,我们调式的时候,误以为,当满足n<=1时,就return了Sum(n),就以为要跳出方法了,没错,它是要return这个方法,但是是return当n-1=1,执行Sum(1)时的这个方法,还有Sum(2),Sum(3)......,这个时候,你应该懂了,在满足n<=1时,是在“穿衣服”,之后,由 return n(n=1)开始,便是一层层“脱衣服”,也就是一层层的return Sum(2),return Sum(3),return Sum(4),return Sum(5)....一直到最初的n=100;才是我们眼前这个方法的真正的return;结果也就是一次次return时同时进行的累加的最终答案:5050!