迴圈與遞迴

Download Report

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