递归:累加算法的递归return,感觉遭遇了“鬼打墙”,递归原理粗解

写在前面的话:此文是我“研究”递归算法的整个思路历程,所以,“废话”有点多,大家自行提取重要信息哦~

说起递归,大家第一反应,不就是方法自己调用自己,多简单的一句话,但是,当你第一次,有着有循环为什么还有递归这东西的时候,说明你准备去百度,这两者的区别了,于是,百度上大量的累加的递归算法,浮现在你眼前,你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!


  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值