Upgrade to Pro — share decks privately, control downloads, hide ads and more …

再帰呼び出し / Python Recursion

kaityo256
November 14, 2023

再帰呼び出し / Python Recursion

プログラミング基礎同演習

kaityo256

November 14, 2023
Tweet

More Decks by kaityo256

Other Decks in Education

Transcript

  1. 5 20 再帰の例:階乗 自然数の階乗を返す関数fact(n)が作りたい def fact(n): a = 1 for

    i in range(1, n+1): a *= i return a 以下のようにループを回してしまうのが簡単だが、再帰で考えてみる
  2. 8 20 再帰の終端条件 fact(n) = n * fact(n-1) fact(n-1) =

    (n-1) * fact(n-2) ... fact(2) = 2 * fact(1) 「分解」を繰り返すと、いつか「これ以上分解できない状態」に到達する 終端条件 ※ 0!=1としてfact(0)まで考えても結果は同じ ここでおしまい
  3. 9 20 再帰の終端条件 def fact(n): if n == 1: return

    1 return n * fact(n-1) 終端条件は(原則として)関数の最初に記述する 終端条件
  4. 10 20 再帰三カ条 階乗を計算する関数 def fact(n): if n == 1:

    return 1 return n * fact(n-1) 1. 定義中に自分自身を呼び出している 2. 関数の最初に終端条件がある 3. 「より小さな問題」として自分を呼びだす 1. 再帰とは、自分自身を呼び出す関数である 2. 関数の最初に「終端条件」を記述する 3. 「解きたい問題より小さな問題」に分解して自分自身を呼び出す
  5. 11 20 再帰関数の実行のされ方 def fact(n): if n == 1: return

    1 return n * fact(n-1) fact(3) fact(2) fact(1) 呼び出し 呼び出し ここで終端条件にマッチ fact(1) = 1 fact(2) = 2 * fact(1) fact(3)ください fact(3) = 3 * fact(2) = 6 再帰は「行って帰って」来る
  6. 12 20 今日これだけは覚えて欲しい 1. 再帰とは、自分自身を呼び出す関数である 2. 関数の最初に「終端条件」を記述する 3. 「解きたい問題より小さな問題」に分解して 自分自身を呼び出す

    再帰三カ条 再帰は「行って帰って」来る fact(3) fact(2) fact(1) 呼び出し 呼び出し ここで終端条件にマッチ fact(1) = 1 fact(2) = 2 * fact(1) fact(3)ください fact(3) = 3 * fact(2) = 6
  7. 13 20 課題1:階段の登り方問題 3 = 1 + 1 + 1

    3 = 1 + 2 3 = 2 + 1 n段の階段を1段もしくは2段を混ぜて登る時、何通りの登り方があるか? n段の階段の登り方の数を返す関数 kaidan(n)が欲しい
  8. 14 20 課題1:階段の登り方問題 3 = 1 + 1 + 1

    3 = 1 + 2 3 = 2 + 1 整数nを、1や2の和として表す方法の数 3 = 1 + 1 + 1 3 = 1 + 2 3 = 2 + 1 4 = 1 + 1 + 1 + 1 4 = 1 + 1 + 2 4 = 1 + 2 + 1 4 = 2 + 1 + 1 4 = 2 + 2 kaidan(3) = 3 kaidan(4) = 5
  9. 16 20 課題1:階段の登り方問題 再帰呼び出しには、必ず終端条件が必要 階段の段数が1段や2段の場合には値を返す def kaidan(n): # 終端条件 if

    条件: return 値 # 再帰部分 return 自分自身を使った式 最終的に関数はこんな形になる 終端条件が二つあることに注意すること
  10. 18 20 バックトラック とりあえず片方を試してみて、ダメなら戻る 1 2 3 4 5 6

    7 将棋や囲碁の思考ルーチンに使われる 数独等では「仮置き」と呼ばれる
  11. 20 20 迷路の解き方(数字版) 0 1 2 0 1 2 3

    3 5 4 5 6 6 7 1. スタートからの距離を記録 2. 距離地図が完成する 0 1 2 3 3 5 4 5 6 6 7 0 1 2 3 3 5 4 5 6 6 7 3. ゴールからカウントダウン 4. スタート地点まで到達したら完成