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
迴圈、遞迴
迴圈主要就是 for loop 和 while現在就讓我們來複習一下吧!
迴圈:
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 <<“ ”;}
除了印出 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; }
嘿嘿 ! 小提醒!變數宣告可以在 for 的括號裡面,也可以在外面唷!
for(int i = 0;i<10;i++){...}
int i; for(i = 0;i<10;i++){...}
FOR LOOP 可是個小小的大功臣唷!彷彿就像大機器人中的一個小螺絲
在 C++ 裡面~
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 <<“ ”;}
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;
替你介紹迴圈的好朋友們:
和
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 只跳出一層迴圈
另外!寫迴圈該注意哪些事呢 ?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++ ){ } // 沒有設終止條件
看了這麼多,我們要來下個小結論給迴圈囉! 事實上, for loop 和 while 就像一個媽媽生的雙胞胎一樣,大部分的人寫迴圈時,最容易犯上一頁說的三個錯誤,所以,上頁那三個注意事項一定要好好記著,這樣,錯誤發生的機率就會減低很多囉!
另外,有時候一口氣寫了好多層迴圈,那麼,括號的對應就變得很重要囉!不要忘了 ! 所有大括號都不要省略!雖然是一個小小的習慣,但是,這可是會影響你之後底霸個或是別人看你的程式的一個大便利唷!
好好利用 for loop 和 while 兩兄弟,配上 continue 和 break兩個好姊妹,那麼,漂亮又厲害的程式,你也寫得出來唷!
接著下來‧‧‧我們就要開始講
所謂 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, 則…
好像不太好懂。。。換個方式想想:如果把函式內呼叫自己的函式看成是另一個函式,但是功能一樣 ,這樣會比較好懂一點。
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 …
不要忘記!
Recursive 的終止條件!
不能忘了寫!
簡單的遞迴範例 ( 仔細看程式到底是怎麼跑的 ) :
當 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 << “ “;
基本遞迴 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
基本遞迴 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
天那。。。我覺得遞迴好難唷!我到底該在什麼時候用它呢?
事實上,遞迴並不會很難,因為結果出來以前,他都是重複的呼叫自己的,感覺就像是洋蔥一樣,一層一層的往內探索,而且,隨著年紀跟經驗的增長,你會發現很多函式都會用到遞迴,久而久之,它就像是你的好鄰居了。 所以,我們要跟好鄰居打好關係,這樣有困難才能尋求他們幫忙啊!不用擔心鄰居的名字叫做“遞迴”就害怕他,我們只要確定,最後可以因為鄰居而得到我們需要的解答,這樣就可以了!
最後‧‧‧我們就來好好練習一下剛剛所學的吧!
基本題 :
( 迴圈 )c013 488 Triangle Waved712 100 The 3n + 1problem
( 遞迴 )c002 10696 F91d672 10922 2 the 9s
進階題 : c015 10018 Reverse and Add c014 10035 PrimaryArithmetic