1. 程式人生 > >遞迴:累加演算法的遞迴return,感覺遭遇了“鬼打牆”,遞迴原理粗解

遞迴:累加演算法的遞迴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!