Transcript 迴圈與遞迴
Slide 1
迴圈、遞迴
Slide 2
迴圈主要就是for loop和while
現在就讓我們來複習一下吧!
Slide 3
For loop:
For loop的格式為→
for( 起始點; 範圍; 條件運算)
起始點:
a.不一定需要
b.可多重宣告
int i = 0, k = 1, j = 3….;
範例:
請印出0~10
for(int i = 0; i < 11; i++)
{
cout<< i <<“ ”;
}
範圍:
a.不一定需要
(但需要其他終止條件)
b.條件可以不只 一個
( i < 0 || k != 5 )
運算條件:
a.不一定要遞增或遞減
b.條件可以不只一個
i++, j = j +2,…
Slide 4
除了印出0~10以外,FOR LOOP還有其他小練習:
a. 印出小於1000的2的n次方:
for(int i=1;i<1000;i=2*i)
{
cout<}
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<}
cout< }
Slide 5
在C++裡面~
嘿嘿!小提醒!
變數宣告可以在for的括號裡面,也可以在外面唷!
for(int i = 0;i<10;i++){...}
int i;
for(i = 0;i<10;i++){...}
FOR LOOP可是個小小的大功臣唷!
彷彿就像大機器人中的一個小螺絲
Slide 6
WHILE:
while的格式為→
While(判斷式)
{ 迴圈內容 }
1.判斷式的資料型態為
bool
2.條件可以不只一個
3.通常寫acm我們會放
while(cin>>a)…C++
While(scanf(%d,a)!=EOF)…C
範例:
請印出0~10
int i=0;
while(i<11)
{
cout<i++;
}
for(int i = 0; i < 11; i++)
{
cout<< i <<“ ”;
}
Slide 7
While的其他小練習:
a.請讓使用者輸入數字,並將這些數字相加起來
int i= 1,keyIn,number,total = 0;
cout<<"請輸入你想輸入的數字有幾個"< cin>>keyIn;
while(i<=keyIn)
{
cout<<"請輸入第"<cin>>number;
total = total + number;
i++;
}
cout<<"您輸入的數字總和"<
Slide 8
替你介紹迴圈的好朋友們:
和
Break:當遇見break時,就會直接跳出迴圈,剩下的都不理了
Continue:執行continue後,會跳到loop最後,然後從頭再開始
a.當遇見i==7時,break:
for(int i=1;i<=10;i++)
{
Break只跳出
if(i==7)
一層迴圈
{break;}
cout<}
b.當遇見5時,continue
for(int i=1;i<=10;i++)
{
if(i==5)
{continue;}
cout<}
Slide 9
另外!寫迴圈該注意哪些事呢?
1.不可以寫超過陣列大小!
有時候,我們設的array並沒有我們寫的範圍那麼大時,我們就該注
意了!不然可能發生”Runtime Error”的錯誤,而且會跑出莫名其妙的
東西。
int a[3]={0,1,2};
for(int i=0 ;i<=4;i++){cout<
2.使用的變數都要在容許的範圍內!
若變數使用沒有在他該出現的範圍內,那會出現compile error的情況。
for(int i=0 ;i<=4;i++){ }
cout<
// name lookup of `i' changed for new ISO `for‘ scoping,
//`i' undeclared (first use this function)
3.一定要記得設終止條件!(但也不要亂設!!)
這個一定要設!不然就會變成無窮迴圈,一直跑下去了!
那這時候就會變成time limit exceeded
for(int i= 0; ;i++ ){ }
for(int i= 0; i<=5; i--){ }
//沒有設終止條件
//i會一直往下跑
Slide 10
看了這麼多,我們要來下個小結論給迴圈囉!
事實上,for loop和while就像一個媽媽生的雙胞胎一樣,
大部分的人寫迴圈時,最容易犯上一頁說的三個錯誤,所以,上
頁那三個注意事項一定要好好記著,這樣,錯誤發生的機率就會
減低很多囉!
另外,有時候一口氣寫了好多層迴圈,那麼,括號的對應
就變得很重要囉!不要忘了!所有大括號都不要省略!雖然是一個
小小的習慣,但是,這可是會影響你之後底霸個或是別人看你的
程式的一個大便利唷!
好好利用for loop和while兩兄弟,配上continue和break兩個
好姊妹,那麼,漂亮又厲害的程式,你也寫得出來唷!
Slide 11
接著下來‧‧‧
我們就要開始講
Slide 12
RECURSIVE:
void f1( int k ){
if( k != 0 ){
所謂recursive,就是”function在自己裡面呼叫自己”,
這個結構就叫做recursive。
cout << k;
f1(k-1);
}
}
假設K= 5,則…
void f1(5){
if( 5 != 0 ){
void f1(4){
cout << 5;
if( 4 != 0 ){
f1( 5-1 );
cout << 4;
}
f1( 4-1 );
void f1(3){
if( k != 0 ){
cout << k;
f1( 3-1 );
}
}
}
}
}
………
Slide 13
好像不太好懂。。。
換個方式想想:
如果把函式內呼叫自己的函式看成是另一個函式
,但是功能一樣 ,這樣會比較好懂一點。
void f1( int k ){
if( k != 0 ){
cout << k;
f1 == f2 == f3 == f4 …
f1(k-1);
}
}
void f1( int k ){
if( k != 0 ){
void f2( int k ){
cout << k;
if( k != 0 ){
f2( k-1 );
cout << k;
}
f3( k-1 );
void f3( int k ){
if( k != 0 ){
cout << k;
f4( k-1 );
}
}
}
}
}
………
Slide 14
不要忘記!
Recursive的終止條件!
不能忘了寫!
Slide 15
簡單的遞迴範例 (仔細看程式到底是怎麼跑的) :
if( 3 > 0 ){
當n=3時
cout << 3 << “ “;
void number( int n){
if( n>0 ){
cout << n << " ";
number(n-1);
cout << n << " ";
}
}
if( 2 > 0 ){
cout << 2 << “ “;
if( 1 > 0 ){
cout << 1 << “ “;
if( 0 > 0 ){
}
3 2 11 1 2 33 請按任意鍵繼續 . . .
cout << 1 << “ “;
}
cout << 2 << “ “;
}
cout << 3 << “ “;
}
Slide 16
基本遞迴1-費式數列 :
F(n) = F(n-1)+F(n-2), F(1) = F(2) = 1
以n=5來舉例:
F(5)=
F(4)=
F(3)=
F(2)=
1
2
F(1)=
3
F(2)=
1
5
F(3)=
1
F(2)=
1
2
F(1)= 1
Slide 17
基本遞迴2-gcd(最大公因數) :
int gcd( int small, int big ){
if( big % small == 0 ){
gcd(1089,2057)
= 121
return small
}
else{
return gcd(968,1089)
= 121
int temp = small;
small = big%small;
big = temp;
return gcd(small,big);
}
}
return gcd(121,968)
= 121
Slide 18
天那。。。
我覺得遞迴好難唷!我到底該在什麼時候用它呢?
事實上,遞迴並不會很難,因為結果出來以前,他都是重複的呼
叫自己的,感覺就像是洋蔥一樣,一層一層的往內探索,而且,隨著
年紀跟經驗的增長,你會發現很多函式都會用到遞迴,久而久之,它
就像是你的好鄰居了。
所以,我們要跟好鄰居打好關係,這樣有困難才能尋求他們幫忙
啊!不用擔心鄰居的名字叫做“遞迴”就害怕他,我們只要確定,最
後可以因為鄰居而得到我們需要的解答,這樣就可以了!
最後‧‧‧
我們就來好好練習一下剛剛所學的吧!
Slide 19
基本題 :
(迴圈)
c013 488 Triangle Wave
d712 100 The 3n + 1problem
(遞迴)
c002 10696 F91
d672 10922 2 the 9s
進階題:
c015 10018 Reverse and Add
c014 10035 PrimaryArithmetic
迴圈、遞迴
Slide 2
迴圈主要就是for loop和while
現在就讓我們來複習一下吧!
Slide 3
For loop:
For loop的格式為→
for( 起始點; 範圍; 條件運算)
起始點:
a.不一定需要
b.可多重宣告
int i = 0, k = 1, j = 3….;
範例:
請印出0~10
for(int i = 0; i < 11; i++)
{
cout<< i <<“ ”;
}
範圍:
a.不一定需要
(但需要其他終止條件)
b.條件可以不只 一個
( i < 0 || k != 5 )
運算條件:
a.不一定要遞增或遞減
b.條件可以不只一個
i++, j = j +2,…
Slide 4
除了印出0~10以外,FOR LOOP還有其他小練習:
a. 印出小於1000的2的n次方:
for(int i=1;i<1000;i=2*i)
{
cout<}
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<}
cout<
Slide 5
在C++裡面~
嘿嘿!小提醒!
變數宣告可以在for的括號裡面,也可以在外面唷!
for(int i = 0;i<10;i++){...}
int i;
for(i = 0;i<10;i++){...}
FOR LOOP可是個小小的大功臣唷!
彷彿就像大機器人中的一個小螺絲
Slide 6
WHILE:
while的格式為→
While(判斷式)
{ 迴圈內容 }
1.判斷式的資料型態為
bool
2.條件可以不只一個
3.通常寫acm我們會放
while(cin>>a)…C++
While(scanf(%d,a)!=EOF)…C
範例:
請印出0~10
int i=0;
while(i<11)
{
cout<i++;
}
for(int i = 0; i < 11; i++)
{
cout<< i <<“ ”;
}
Slide 7
While的其他小練習:
a.請讓使用者輸入數字,並將這些數字相加起來
int i= 1,keyIn,number,total = 0;
cout<<"請輸入你想輸入的數字有幾個"<
while(i<=keyIn)
{
cout<<"請輸入第"<cin>>number;
total = total + number;
i++;
}
cout<<"您輸入的數字總和"<
Slide 8
替你介紹迴圈的好朋友們:
和
Break:當遇見break時,就會直接跳出迴圈,剩下的都不理了
Continue:執行continue後,會跳到loop最後,然後從頭再開始
a.當遇見i==7時,break:
for(int i=1;i<=10;i++)
{
Break只跳出
if(i==7)
一層迴圈
{break;}
cout<}
b.當遇見5時,continue
for(int i=1;i<=10;i++)
{
if(i==5)
{continue;}
cout<}
Slide 9
另外!寫迴圈該注意哪些事呢?
1.不可以寫超過陣列大小!
有時候,我們設的array並沒有我們寫的範圍那麼大時,我們就該注
意了!不然可能發生”Runtime Error”的錯誤,而且會跑出莫名其妙的
東西。
int a[3]={0,1,2};
for(int i=0 ;i<=4;i++){cout<
2.使用的變數都要在容許的範圍內!
若變數使用沒有在他該出現的範圍內,那會出現compile error的情況。
for(int i=0 ;i<=4;i++){ }
cout<
// name lookup of `i' changed for new ISO `for‘ scoping,
//`i' undeclared (first use this function)
3.一定要記得設終止條件!(但也不要亂設!!)
這個一定要設!不然就會變成無窮迴圈,一直跑下去了!
那這時候就會變成time limit exceeded
for(int i= 0; ;i++ ){ }
for(int i= 0; i<=5; i--){ }
//沒有設終止條件
//i會一直往下跑
Slide 10
看了這麼多,我們要來下個小結論給迴圈囉!
事實上,for loop和while就像一個媽媽生的雙胞胎一樣,
大部分的人寫迴圈時,最容易犯上一頁說的三個錯誤,所以,上
頁那三個注意事項一定要好好記著,這樣,錯誤發生的機率就會
減低很多囉!
另外,有時候一口氣寫了好多層迴圈,那麼,括號的對應
就變得很重要囉!不要忘了!所有大括號都不要省略!雖然是一個
小小的習慣,但是,這可是會影響你之後底霸個或是別人看你的
程式的一個大便利唷!
好好利用for loop和while兩兄弟,配上continue和break兩個
好姊妹,那麼,漂亮又厲害的程式,你也寫得出來唷!
Slide 11
接著下來‧‧‧
我們就要開始講
Slide 12
RECURSIVE:
void f1( int k ){
if( k != 0 ){
所謂recursive,就是”function在自己裡面呼叫自己”,
這個結構就叫做recursive。
cout << k;
f1(k-1);
}
}
假設K= 5,則…
void f1(5){
if( 5 != 0 ){
void f1(4){
cout << 5;
if( 4 != 0 ){
f1( 5-1 );
cout << 4;
}
f1( 4-1 );
void f1(3){
if( k != 0 ){
cout << k;
f1( 3-1 );
}
}
}
}
}
………
Slide 13
好像不太好懂。。。
換個方式想想:
如果把函式內呼叫自己的函式看成是另一個函式
,但是功能一樣 ,這樣會比較好懂一點。
void f1( int k ){
if( k != 0 ){
cout << k;
f1 == f2 == f3 == f4 …
f1(k-1);
}
}
void f1( int k ){
if( k != 0 ){
void f2( int k ){
cout << k;
if( k != 0 ){
f2( k-1 );
cout << k;
}
f3( k-1 );
void f3( int k ){
if( k != 0 ){
cout << k;
f4( k-1 );
}
}
}
}
}
………
Slide 14
不要忘記!
Recursive的終止條件!
不能忘了寫!
Slide 15
簡單的遞迴範例 (仔細看程式到底是怎麼跑的) :
if( 3 > 0 ){
當n=3時
cout << 3 << “ “;
void number( int n){
if( n>0 ){
cout << n << " ";
number(n-1);
cout << n << " ";
}
}
if( 2 > 0 ){
cout << 2 << “ “;
if( 1 > 0 ){
cout << 1 << “ “;
if( 0 > 0 ){
}
3 2 11 1 2 33 請按任意鍵繼續 . . .
cout << 1 << “ “;
}
cout << 2 << “ “;
}
cout << 3 << “ “;
}
Slide 16
基本遞迴1-費式數列 :
F(n) = F(n-1)+F(n-2), F(1) = F(2) = 1
以n=5來舉例:
F(5)=
F(4)=
F(3)=
F(2)=
1
2
F(1)=
3
F(2)=
1
5
F(3)=
1
F(2)=
1
2
F(1)= 1
Slide 17
基本遞迴2-gcd(最大公因數) :
int gcd( int small, int big ){
if( big % small == 0 ){
gcd(1089,2057)
= 121
return small
}
else{
return gcd(968,1089)
= 121
int temp = small;
small = big%small;
big = temp;
return gcd(small,big);
}
}
return gcd(121,968)
= 121
Slide 18
天那。。。
我覺得遞迴好難唷!我到底該在什麼時候用它呢?
事實上,遞迴並不會很難,因為結果出來以前,他都是重複的呼
叫自己的,感覺就像是洋蔥一樣,一層一層的往內探索,而且,隨著
年紀跟經驗的增長,你會發現很多函式都會用到遞迴,久而久之,它
就像是你的好鄰居了。
所以,我們要跟好鄰居打好關係,這樣有困難才能尋求他們幫忙
啊!不用擔心鄰居的名字叫做“遞迴”就害怕他,我們只要確定,最
後可以因為鄰居而得到我們需要的解答,這樣就可以了!
最後‧‧‧
我們就來好好練習一下剛剛所學的吧!
Slide 19
基本題 :
(迴圈)
c013 488 Triangle Wave
d712 100 The 3n + 1problem
(遞迴)
c002 10696 F91
d672 10922 2 the 9s
進階題:
c015 10018 Reverse and Add
c014 10035 PrimaryArithmetic