Advertisement
uopspop

Untitled

Jan 16th, 2022
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1.  
  2. 在程式碼的實作中,大方向上可分出兩大類實作:
  3.  
  4.  
  5.  
  6. I 迴圈 (for loop, while loop)
  7.  
  8. II 遞迴 (Recursion)
  9.  
  10.  
  11.  
  12. 基本上,任何一種實作都能在兩者之間互換,但也通常會有一者實作起來更順手。
  13.  
  14. 在此單元,我們來看到遞迴的實作示範:
  15.  
  16.  
  17.  
  18. 遞迴觀念:老和尚說故事
  19.  
  20.  
  21.  
  22. 不知道大家有沒有聽過下面這個故事:
  23.  
  24. 「從前有座山,山上有座廟,廟裡住著老和尚與小和尚,有一天老和尚跟小和尚講故事說:從前有座山,山上有座廟,廟裡住著・・・・・」
  25.  
  26.  
  27.  
  28. 遞迴的概念與此非常相似,會一直呼叫自己,直到遇到終止條件!
  29.  
  30.  
  31.  
  32. 遞迴實作:費氏數列(Fibonacci)
  33.  
  34.  
  35.  
  36. 首先,來看到一個有趣的小知識:
  37.  
  38. 在生活中,其實我們眼睛很習慣看1:1.618這個俗稱「黃金比例」的形體,比如說夏天常見的颱風、宇宙銀河系的分佈都是如此
  39.  
  40.  
  41.  
  42.  
  43.  
  44. 那這個黃金比例與費氏數列的關係在哪?
  45.  
  46.  
  47.  
  48. 費氏數列長這個樣子:
  49.  
  50. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
  51.  
  52.  
  53.  
  54. 觀察一下可以看出,除了第一個跟第二個數字之外,後面的數字都是前兩個數字的相加
  55.  
  56. ex. 1 = 0 + 1
  57.  
  58. ex. 2 = 1 + 1
  59.  
  60. ex. 8 = 3 + 5
  61.  
  62.  
  63.  
  64. 而如果我們將一個數字 ÷ 前一個數字,我們將得到越來越接近1.618這個黃金比例:
  65.  
  66. ex. 8 ÷ 5 = 1.6
  67.  
  68. ex. 55 ÷ 34 = 1.617...
  69.  
  70. ex. 233 ÷ 144 = 1.618...
  71.  
  72.  
  73.  
  74. 所以到這邊,我們知道電腦科學學生必學的這個費氏數列,並不是一個冷冰冰的數學公式,而是一個自然甚至是生活中常見的現象。
  75.  
  76.  
  77.  
  78. 那現在,我們要透過程式,把費氏數列透過程式碼的形式展現出來,同時我們也來看看「遞迴(recursion)」的實作方式:
  79.  
  80. public static Integer fibonacci(int n){
  81. if (n == 0) return 0; // first number
  82. if (n == 1) return 1; // second number
  83.  
  84. /** next round **/
  85. return fibonacci(n - 2) + fibonacci(n - 1);
  86. }
  87.  
  88.  
  89. 以上這個實作,我們就透過每一輪之中,把n-1, n-2之後再呼叫方法自己本身,也就能拿到我們最後的數字。
  90.  
  91. 這邊也建議大家,如果是第一次學遞迴,可以拿張紙把整個分支展開畫出來,仔細觀察一下遞迴的路線是怎麼「長」出來的。
  92.  
  93. 這邊提供測試程式碼,有興趣的學員可以自己跑跑看:
  94.  
  95. public static void main(String[] args) {
  96. for (int i = 0; i < 20; i++) {
  97. System.out.print(fibonacci(i) + " ");
  98. // 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
  99. }
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement