遞迴課堂任務
a072. 啊就階乘,簡單吧>.0
遞迴思維建立
- 欲求 的值,只要知道 的值,再乘以 ,即為所求。
- 請參考課本 2-2:遞迴函式,內有階乘函式的迴圈版本與遞迴版本。
範例程式碼
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
- 請嘗試改寫以上程式,輸入一正整數
n
,可輸出 的值。
- 若將雙斜線處取消註解,程式可以計算並輸出總共呼叫
fac()
函式幾次。
a084. 偉晉的考驗
遞迴思維建立
- :沒我的話,要從剩下 人選出 人;有我的話,要從剩下 人選出 人。
- 終止條件設定:如果不需再挑選任何人(),或是人數剛好等於需要挑選的人數(),挑選方法都只有一種。
範例程式碼
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
請嘗試改寫以上程式,輸入一兩個整數a
、b
,可輸出 的值。
延伸練習:a054. 出來打球
Hints
- :沒我的話,要從剩下 人選出 人;有我的話,我先選擇在 件球衣中穿哪一件,然後每種穿法都要再從剩下 人選出 人,繼續遞迴下去。
- 終止條件設定:
- 如果不需再挑選任何人(),挑選方法就只剩一種。
- 如果人數剛好等於需要挑選的人數,那麼「我先選擇在 件球衣中穿哪一件」,然後每種穿法都要再從剩下 人選出 人,繼續遞迴下去。在這種狀況下,本問題即收斂成階乘問題。
a158. 長腿阿馨爬樓梯
遞迴思維建立
f(int n)
:代表 n
階樓梯可以有幾種不同的走法。
- 若選擇走一階,接下來的走法共有
f(n-1)
種;若選擇走兩階,接下來的走法共有f(n-2)
種,以此類推。
- 假設阿馨只能走一階或兩階,那麼走法的總數會是「走了一階之後的走法 + 走了兩階之後的走法」。
- 終止條件設定:假設阿馨只能走一階或兩階,
- 如果樓梯只有 1 階,只有 1 種走法。
- 如果樓梯只有 2 階,共有 2 種走法( 1+1 或 一次走 2 階)。
範例程式碼
假設阿馨只能走一階或兩階,寫法如下:
請嘗試改寫以上程式,將走三階納入考量。
a160. 小妮爬樓梯(總次數上限版)
遞迴思維建立
f(int n, int k)
:代表 n
階樓梯只能跨兩階k
次以內,可以有幾種不同的走法。
- 若選擇走一階,接下來的走法共有
f(n-1, k)
種;若選擇走兩階,「會用掉一次跨兩階的扣打」,那麼接下來的走法共有f(n-2, _____)
種呢?
- 終止條件設定:
- 如果樓梯只有 1 階,只有 1 種走法。
- 如果樓梯只有 2 階,需要將
k
值納入考量。與上一題相比,如果還有跨兩階的扣打,會有幾種走法?如果跨兩階的扣打沒了,則剩下幾種走法?
- 如果不是剩下 1 階或 2 階,但跨兩階的扣打沒了,那就只能走一階,此時
n
階的走法數量相當於n-1
階的走法數量。
範例程式碼
請嘗試填空以上程式,找出完整遞迴式,並根據k
的值,決定還剩 2 階的走法。
延伸練習:a161. 小湊爬樓梯(連續次數上限版)
Hints
- 遞迴函式內,參數的意義改變了。
n
代表有幾個階梯,k
則代表 還剩幾次連跳2階的扣打。
- 設立一全域變數,紀錄原始連跳2階的扣打。當遞迴函式內,呼叫了走 1 階的選擇,則將連跳 2 階的扣打值設為此全域變數。
- 若不想設立全域變數,亦可新增一個遞迴函式參數,存放原始連走 2 階的扣打。