在應(yīng)用程序中為什么要使用遞歸?何時使用遞歸?如何用? “寫任何一個程序可以用賦值和if-then-else語句表示出來,而while語句則可以用賦值、if-then-else和遞歸表示出來?!保ǔ鲎訣llis Horowitz的《數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)(C語言版)》 - Fundamentals of Data Structure in C) 遞歸解決方案對于復(fù)雜的開發(fā)來說很方便,而且十分強大,但由于頻繁使用調(diào)用棧(call stack)可能會引起性能問題(有些時候性能極差)。 我們來看一看下面這個圖: 調(diào)用棧圖示 下面我打算介紹一些例子來幫助你更好的理解遞歸的風(fēng)險和回報。 1. 階乘 階乘(!)是小于某個數(shù)的所有正整數(shù)的乘積。 0! = 1 1! = 1 2! = 2 * 1! = 2 3! = 3 * 2! = 6 ... n! = n * (n - 1)! 下面是計算階乘的一種實現(xiàn)方法(沒有遞歸): 代碼如下: public long Factorial(int n) { if (n == 0) return 1; long value = 1; for (int i = n; i > 0; i--) { value *= i; } return value; }
下面是用遞歸的方法實現(xiàn)計算階乘,與之前的代碼比起來它更簡潔。 代碼如下: public long Factorial(int n) { if (n == 0)//限制條件,對該方法調(diào)用自己做了限制 return 1; return n * Factorial(n - 1); }