13
2016-04-22 11:01:00
- Switch…case 總結(網摘)
例題:
Console.WriteLine("1.漢堡包"); Console.WriteLine("2.薯條"); Console.WriteLine("3.雞塊"); Console.WriteLine("4.雞腿"); Console.WriteLine("5.雞米花"); Console.Write("請輸入您的選擇項目數字:"); string a = Console.ReadLine(); switch (a) { case "1": Console.WriteLine("您選擇的是漢堡包!"); break; case "2": Console.WriteLine("您選擇的是薯條!"); break; case "3": Console.WriteLine("您選擇的是雞塊!"); break; case "4": Console.WriteLine("您選擇的是雞腿!"); break; case "5": Console.WriteLine("您選擇的是雞米花!"); break; default: Console.WriteLine("輸入有誤!"); break; }
總結:switch語句和if語句的區別:
● 大於等於(>=)、小於等於(<=)的判斷用if語句,而等於(=)的判斷用switch語句。
● switch語句中的case類似於if…else…else if…else,但是離散值的判斷。
(離散值的判斷自認為是等於情況的判斷)。
● switch一般都可以及用if重寫,但是if不一定能用switch重寫。
●不要忘了break.C#中break不寫是不行的,除了合並case的情況。
● case 中的值必須是常量,不能是變量、表達式。
2.遞歸算法(網摘)
簡介:
在數學與計算機科學中,遞歸是指在函數的定義中使用函數自身的方法。
遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。
遞歸算法解決問題的特點:
(1) 遞歸就是在過程或函數里調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。在實際編程中尤其要注意棧溢出問題。
借助遞歸方法,我們可以把一個相對復雜的問題轉化為一個與原問題相似的規模較小的問題來求解,遞歸方法只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。但在帶來便捷的同時,也會有一些缺點,也即:通常用遞歸方法的運行效率不高。
【問題】 編寫計算斐波那契(Fibonacci)數列的第n項函數fib(n)。
斐波那契數列為:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (當n>1時)。
寫成遞歸函數有:
int fib(int n)
{ if (n==0) return 0;
if (n==1) return 1;
if (n>1) return fib(n-1)+fib(n-2);
}
遞歸算法的執行過程分遞推和回歸兩個階段。在遞推階段,把較復雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞歸的情況。例如在函數fib中,當n為1和0的情況。
在回歸階段,當獲得最簡單情況的解后,逐級返回,依次得到稍復雜問題的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果后,返回得到fib(n)的結果。
在編寫遞歸函數時要注意,函數中的局部變量和參數知識局限於當前調用層,當遞推進入“簡單問題”層時,原來層次上的參數和局部變量便被隱蔽起來。在一系列“簡單問題”層,它們各有自己的參數和局部變量。
由於遞歸引起一系列的函數調用,並且可能會有一系列的重復計算,遞歸算法的執行效率相對較低。當某個遞歸算法能較方便地轉換成遞推算法時,通常按遞推算法編寫程序。例如上例計算斐波那契數列的第n項的函數fib(n)應采用遞推算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。
習題:
1. 計算1+2+3+4+...+100的值
static void Main(string[] args) { Console.WriteLine(Process2(100)); Console.ReadLine(); } public static int Process2(int i) { //計算1+2+3+4+...+100的值 if (i == 0) return 0; return Process2(i - 1) + i; }
2. 計算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值
static void Main(string[] args) { Console.WriteLine(Process3(9) - Process3(8)); Console.ReadLine(); } public static int Process3(int i) { //計算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值 if (i == 0) return 1; if (i == 1) return 2; else return Process3(i - 2) + i; }
3.漢諾塔問題
static void Main(string[] args) { Hanoi(5, 'A', 'B', 'C'); Console.ReadLine(); } public static void Hanoi(int n ,char A, char B, char C) { //漢諾塔問題 //將n個盤子從A座借助B座,移到C座 if (n == 1) Move(A, C); else { Hanoi(n - 1, A, C, B); Move(A, C); Hanoi(n - 1, B, A, C); } } public static void Move(char startPlace, char endPlace) { Console.WriteLine("Move {0} To {1}",startPlace,endPlace); }
4.一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少
1)遞歸算法實現
Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i <= 0) return 0; else if (i > 0 && i <= 2) return 1; else return Foo(i - 1) + Foo(i - 2);
2)for 循環
int a = 1, b = 1, c = 2; for (int j = 3; j <= 30; j++) { c = a + b; a = b; b = c; } Console.WriteLine(c);
3)while 循環
int a = 1, b = 1, c = 2; int k = 3; while (k<=30) { c = a + b; a = b; b = c; k++; } Console.WriteLine(c);