什么是遞歸?
先看語言例子
從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?“從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?‘從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?……’”
一只狗來到廚房,偷走一小塊面包。廚子舉起杓子,把那只狗打死了。於是所有的狗都跑來了,給那只狗掘了一個墳墓,還在墓碑上刻了墓志銘,讓未來的狗可以看到:“一只狗來到廚房,偷走一小塊面包。廚子舉起杓子,把那只狗打死了。於是所有的狗都跑來了,給那只狗掘了一個墳墓,還在墓碑上刻了墓志銘,讓未來的狗可以看到:‘一只狗來到廚房,偷走一小塊面包。廚子舉起杓子,把那只狗打死了。於是所有的狗都跑來了,給那只狗掘了一個墳墓,還在墓碑上刻了墓志銘,讓未來的狗可以看到……’”
看到了吧,不斷的循環重復。
再來看數學例子,
斐波那契數列是典型的遞歸案例:
F0=0; F=1; FN= Fn-1+Fn-2
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
這里需要注意 0不是第一項,而是第0項
再來看下編程思想
我們在編程語言里面可以看作是方法調用自己,不斷的調用。直至有某個條件來終止,則停止調用。
上代碼
namespace 遞歸算法 { class Program { public static void Main(string[] args) { //輸出1,2,3,4,8,13,21,34,55,89 //屌絲算法 int[] countNumber=new int[10]; for(int i=0;i<countNumber.Length;i++) { if(i==0) { countNumber[0]=1; } else if(i==1) { countNumber[1]=2; } if(i>=2) { countNumber[i]=countNumber[i-1]+countNumber[i-2]; } } foreach(var Num in countNumber) { Console.Write(Num+" "); } Console.WriteLine("\n------------- 我是分割線 --------------- "); //文藝算法,遞歸 int[] countNumber2=new int[10]; for(int i=0;i<countNumber2.Length;i++) { countNumber2[i]=DiGui(i); } foreach(var Num2 in countNumber2) { Console.Write(Num2 +" "); } Console.ReadKey(); } public static int DiGui(int j) { int s; if(j==0||j==1) { s=j+1; } else { s=DiGui(j-1)+DiGui(j-2); //調用方法本身 } return s; } } }
傳送門:遞歸經典算法
傳送門:遞歸算法為什么那么慢?