19
迴迴 迴迴

迴圈、遞迴

  • Upload
    manchu

  • View
    59

  • Download
    2

Embed Size (px)

DESCRIPTION

迴圈、遞迴. 迴圈:. 迴圈主要就是 for loop 和 while 現在就讓我們來複習一下吧!. For loop :. For loop 的格式為→. for( 起始點 ; 範圍 ; 條件運算 ). 範例: 請印出 0~10 for(int i = 0; i < 11; i++) { cout

Citation preview

Page 1: 迴圈、遞迴

迴圈、遞迴

Page 2: 迴圈、遞迴

迴圈主要就是 for loop 和 while現在就讓我們來複習一下吧!

迴圈:

Page 3: 迴圈、遞迴

For loop :For loop 的格式為→

for( 起始點 ; 範圍 ; 條件運算 )起始點:a. 不一定需要b. 可多重宣告int i = 0, k = 1, j = 3….;

範圍:a. 不一定需要 ( 但需要其他終止條件 )b. 條件可以不只 一個 ( i < 0 || k != 5 )

運算條件:a. 不一定要遞增或遞減b. 條件可以不只一個 i++, j = j +2,…

範例:請印出 0~10for(int i = 0; i < 11; i++){ cout<< i <<“ ”;}

Page 4: 迴圈、遞迴

除了印出 0~10 以外, FOR LOOP 還有其他小練習:a. 印出小於 1000 的 2 的 n 次

方: for(int i=1;i<1000;i=2*i) { cout<<i<<endl; }

b. 利用兩個 for loop 印出矩陣: int a[3][3]={0,1,2,3,4,5,6,7,8}; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { cout<<a[i][j]<<" "; } cout<<endl; }

Page 5: 迴圈、遞迴

嘿嘿 ! 小提醒!變數宣告可以在 for 的括號裡面,也可以在外面唷!

for(int i = 0;i<10;i++){...}

int i; for(i = 0;i<10;i++){...}

FOR LOOP 可是個小小的大功臣唷!彷彿就像大機器人中的一個小螺絲

在 C++ 裡面~

Page 6: 迴圈、遞迴

int i=0; while(i<11) { cout<<i<<" "; i++; }

WHILE:while 的格式為→

While( 判斷式 ) { 迴圈內容 }

1. 判斷式的資料型態為 bool2. 條件可以不只一個3. 通常寫 acm 我們會放while(cin>>a)…C++While(scanf(%d,a)!=EOF)…C

範例:請印出 0~10

for(int i = 0; i < 11; i++){ cout<< i <<“ ”;}

Page 7: 迴圈、遞迴

While 的其他小練習:a. 請讓使用者輸入數字,並將這些數字相加起來

int i= 1,keyIn,number,total = 0; cout<<" 請輸入你想輸入的數字有幾個 "<<endl; cin>>keyIn; while(i<=keyIn) { cout<<" 請輸入第 "<<i<<" 個數字 :"; cin>>number; total = total + number; i++; } cout<<" 您輸入的數字總和 "<<total<<endl;

Page 8: 迴圈、遞迴

替你介紹迴圈的好朋友們:

Continue :執行 continue 後,會跳到 loop 最後,然後從頭再開始

Break :當遇見 break 時,就會直接跳出迴圈,剩下的都不理了

a. 當遇見 i==7 時, break: for(int i=1;i<=10;i++) { if(i==7) {break;} cout<<i<<" "; }

b. 當遇見 5 時, continue for(int i=1;i<=10;i++) { if(i==5) {continue;} cout<<i<<" "; }

Continue break

Break 只跳出一層迴圈

Page 9: 迴圈、遞迴

另外!寫迴圈該注意哪些事呢 ?1. 不可以寫超過陣列大小! 有時候,我們設的 array 並沒有我們寫的範圍那麼大時,我們就該注意了!不然可能發生” Runtime Error” 的錯誤,而且會跑出莫名其妙的東西。 int a[3]={0,1,2}; for(int i=0 ;i<=4;i++){cout<<a[i]<<" "};

2. 使用的變數都要在容許的範圍內! 若變數使用沒有在他該出現的範圍內,那會出現 compile error 的情況。

3. 一定要記得設終止條件! ( 但也不要亂設 !!) 這個一定要設!不然就會變成無窮迴圈,一直跑下去了!那這時候就會變成 time limit exceeded

for(int i=0 ;i<=4;i++){ } // name lookup of `i' changed for new ISO `for‘ scoping, cout<<i; //`i' undeclared (first use this function)

for(int i= 0; i<=5; i--){ } //i 會一直往下跑for(int i= 0; ;i++ ){ } // 沒有設終止條件

Page 10: 迴圈、遞迴

看了這麼多,我們要來下個小結論給迴圈囉!    事實上, for loop 和 while 就像一個媽媽生的雙胞胎一樣,大部分的人寫迴圈時,最容易犯上一頁說的三個錯誤,所以,上頁那三個注意事項一定要好好記著,這樣,錯誤發生的機率就會減低很多囉!

  另外,有時候一口氣寫了好多層迴圈,那麼,括號的對應就變得很重要囉!不要忘了 ! 所有大括號都不要省略!雖然是一個小小的習慣,但是,這可是會影響你之後底霸個或是別人看你的程式的一個大便利唷!

   好好利用 for loop 和 while 兩兄弟,配上 continue 和 break兩個好姊妹,那麼,漂亮又厲害的程式,你也寫得出來唷!

Page 11: 迴圈、遞迴

接著下來‧‧‧我們就要開始講

Page 12: 迴圈、遞迴

所謂 recursive ,就是” function 在自己裡面呼叫自己”,這個結構就叫做 recursive 。

RECURSIVE : void f1( int k ){ if( k != 0 ){ cout << k; f1(k-1); }}

void f1(5){

if( 5 != 0 ){

cout << 5;

f1( 5-1 );

}

}

void f1(4){

if( 4 != 0 ){

cout << 4;

f1( 4-1 );

}

}

void f1(3){

if( k != 0 ){

cout << k;

f1( 3-1 );

}

}………

假設 K= 5, 則…

Page 13: 迴圈、遞迴

好像不太好懂。。。換個方式想想:如果把函式內呼叫自己的函式看成是另一個函式,但是功能一樣 ,這樣會比較好懂一點。

void f1( int k ){

if( k != 0 ){

cout << k;

f2( k-1 );

}

}

void f2( int k ){

if( k != 0 ){

cout << k;

f3( k-1 );

}

}

void f3( int k ){

if( k != 0 ){

cout << k;

f4( k-1 );

}

}………

void f1( int k ){ if( k != 0 ){ cout << k; f1(k-1); }}

f1 == f2 == f3 == f4 …

Page 14: 迴圈、遞迴

不要忘記!

Recursive 的終止條件!

不能忘了寫!

Page 15: 迴圈、遞迴

簡單的遞迴範例 ( 仔細看程式到底是怎麼跑的 ) :

當 n = 3 時void number( int n){ if( n>0 ){ cout << n << " "; number(n-1); cout << n << " "; } }

3 2 1 1 2 3 請按任意鍵繼續 . . .

if( 3 > 0 ){

}

if( 2 > 0 ){

}

if( 1 > 0 ){

}

if( 0 > 0 ){

}請按任意鍵繼續 . . .2112

cout << 2 << “ “;

3 3

cout << 3 << “ “;

cout << 2 << “ “;

cout << 3 << “ “;

cout << 1 << “ “;

cout << 1 << “ “;

Page 16: 迴圈、遞迴

基本遞迴 1- 費式數列 :

F(n) = F(n-1)+F(n-2), F(1) = F(2) = 1

以 n=5 來舉例 :F(5)=

F(4)= F(3)=

F(3)= F(2)= F(2)= F(1)=

F(1)=F(2)= 1 1

1 1 1

2

2

3

5

Page 17: 迴圈、遞迴

基本遞迴 2-gcd( 最大公因數 ) :int gcd( int small, int big ){

if( big % small == 0 ){

return small

}

else{

int temp = small;

small = big%small;

big = temp;

return gcd(small,big);

}

}

gcd(1089,2057)

return gcd(968,1089)

return gcd(121,968) = 121

= 121

= 121

Page 18: 迴圈、遞迴

天那。。。我覺得遞迴好難唷!我到底該在什麼時候用它呢?

  事實上,遞迴並不會很難,因為結果出來以前,他都是重複的呼叫自己的,感覺就像是洋蔥一樣,一層一層的往內探索,而且,隨著年紀跟經驗的增長,你會發現很多函式都會用到遞迴,久而久之,它就像是你的好鄰居了。  所以,我們要跟好鄰居打好關係,這樣有困難才能尋求他們幫忙啊!不用擔心鄰居的名字叫做“遞迴”就害怕他,我們只要確定,最後可以因為鄰居而得到我們需要的解答,這樣就可以了!

最後‧‧‧我們就來好好練習一下剛剛所學的吧!