recursion - github pagestw-csie-sprout.github.io/programming15spring/pages/...練習:toj #33 •...

62
遞回 Recursion by 多拉A夢

Upload: others

Post on 15-Jul-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

遞回 Recursion

by 多拉A夢

Page 2: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

來看看⼩小時候學的遞回...

Page 3: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F0 = 0 Fn = Fn-1 + 1 ( n >= 1)

⼩小時候的我們...

Page 4: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F0 = 0 Fn = Fn-1 + 1 ( n >= 1) F1 = F0 + 1 =0 + 1 = 1

⼩小時候的我們...

Page 5: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F0 = 0 Fn = Fn-1 + 1 ( n >= 1) F2 = F1 + 1 = (F0+1)+1 = 2

⼩小時候的我們...

Page 6: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 = (F1+1)+1 = ((F0+1)+1)+1 = 3

⼩小時候的我們...

Page 7: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

數字太難看?

Page 8: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

還是很難想像:D?

Page 9: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:D

F3

F2

F1

F0

Page 10: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = ? !

F3

F2

F1

F0

Page 11: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 !

F3

F2

F1

F0

Page 12: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = F1 + 1

F3

F2

F1

F0

Page 13: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = F1 + 1 F1 = F0 + 1

F3

F2

F1

F0

Page 14: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = F1 + 1 F1 = F0 + 1

F3

F2

F1

F00

Page 15: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = F1 + 1 F1 = 0 + 1

F3

F2

F1

F000+1

Page 16: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = 1 + 1 F1 = 0 + 1

F3

F2

F1

F000+1

1+1

Page 17: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:DF0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = 2 + 1 F2 = 1 + 1

F3

F2

F1

F000+1

1+1

2+1

Page 18: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

讓遞回變成⼀一座塔:D

F3

F2

F1

F0 F0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = 1 + 1 F1 = 0 + 1

Page 19: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

當然你也可以想成⼀一串貢丸...

F0

F1

F2 F3

+ 1

+ 1

+ 1

F0 = 0 Fn = Fn-1 + 1 ( n >= 1) F3 = F2 + 1 F2 = 1 + 1 F1 = 0 + 1

Page 20: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

說了這麼多... 然後咧XD

Page 21: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

怎麼⽣生出程式來:D?

Page 22: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

還記得上禮拜學的...

Function ~

Page 23: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

Review - 兩數最⼤大值

Page 24: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

把遞回式寫成函數F0 = 0 Fn = Fn-1 + 1 ( n >= 1)

Page 25: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

把遞回式寫成函數F0 = 0 Fn = Fn-1 + 1 ( n >= 1)

F(0) = 0 F(n) = F(n-1) + 1 ( n >= 1)

Page 26: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

把遞回條件定出來F(0) = 0 F(n) = F(n-1) + 1 ( n >= 1)

if( n == 0 ) 回傳 0; 其他狀況: return F(n-1) + 1;

Page 27: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

來來來~Code抵家~

Page 28: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

如果要從1+2+3+...+n

要怎麼改剛剛的code呢?

(hint:只要改⼀一個地⽅方)

Page 29: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

改這裡噢~

Page 30: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

列式⼦子: F(0) = 0 F(n) = F(n-1) + n

如果還不太理解的話...

Page 31: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

列式⼦子: F(0) = 0 F(n) = F(n-1) + n

如果還不太理解的話...

條件定出來: if( n == 0 ) return 0 else return F(n-1) + n

Page 32: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

3

Page 33: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

3

3

Page 34: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

3

3 - 1 = 2

Page 35: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

3

F(2)

Page 36: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(2)

Page 37: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

2

Page 38: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

2 - 1 = 1

Page 39: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(1)

Page 40: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(1)

Page 41: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

1

Page 42: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

1 - 1 = 0

Page 43: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(0)

Page 44: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(0)

Page 45: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

0

Page 46: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

0

Page 47: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(0) = 01

0

Page 48: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(0) + 11

Page 49: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F(1) = 1 2

F(0) + 1=11

直接⽤用Code來思考...

Page 50: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F(1)+2 = 1+2 2

直接⽤用Code來思考...

Page 51: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

F(1)+2 = 1+2 2

直接⽤用Code來思考...

F(2)=3 3

Page 52: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(2)+3=3+3 3

Page 53: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

直接⽤用Code來思考...

F(2)+3 = 3+3 3

F(3) = 6

呼... 投影⽚片終於做完了

Page 54: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

遞回最終哲學:f(f(x))

Page 55: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

遞回最終哲學:f(f(x))

⾃自⼰己呼叫⾃自⼰己:D

Page 56: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

必須要注意的地⽅方

• 遞回必須要設好底線~~~~~~要不然會爛掉XDDDDDD

• EX. if( n == 0) return 0;

Page 57: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

範例:GCD

輾轉相除法

Page 58: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

練習:TOJ #33• 費波那契數列

• 提⽰示:列出遞回關係式—>改成函數表達式

• 列出關係式後,注意起點不⽌止⼀一個

• f(0) = 1

• f(1) = 1

• 寫成Code萬歲!!!!

Page 59: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

練習:TOJ #33

•請嘗試跑出第100個數字

•你會發現它跑得⾮非常慢XDDDD •甚⾄至在今天跑不出來XD

Page 60: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

練習:TOJ #33

Page 61: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

練習:TOJ #33

•你應該會發現到.......

•輕鬆表達數學遞回 •但是效率有點差

Page 62: Recursion - GitHub Pagestw-csie-sprout.github.io/programming15spring/pages/...練習:TOJ #33 • 費波那契數列 • 提:列出遞回關係式 —>改成函數表達式 •

練習:TOJ #33

•有時候⽤用迴圈跑⽐比較快XD •想⼀一下費式數列怎麼⽤用迴圈跑