Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
再帰呼び出し / Python Recursion
Search
kaityo256
PRO
November 14, 2023
Education
0
2.1k
再帰呼び出し / Python Recursion
プログラミング基礎同演習
kaityo256
PRO
November 14, 2023
Tweet
Share
More Decks by kaityo256
See All by kaityo256
モンテカルロ法(3) 発展的アルゴリズム / Simulation 04
kaityo256
PRO
7
1.4k
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
5
2.2k
SSH公開鍵認証による接続 / Connecting with SSH Public Key Authentication
kaityo256
PRO
4
510
論文紹介のやり方 / How to review
kaityo256
PRO
15
84k
デバッグの話 / Debugging for Beginners
kaityo256
PRO
12
1.6k
ビット演算の話 / Let's play with bit operations
kaityo256
PRO
8
570
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
15
5.3k
制限ボルツマンマシンの話 / Introduction of RBM
kaityo256
PRO
3
1.3k
論文の読み方 / How to survey
kaityo256
PRO
223
180k
Other Decks in Education
See All in Education
中間活動報告会 人材育成WG・技術サブWG / 20250808-oidfj-eduWG-techSWG
oidfj
0
200
Alumnote inc. Company Deck
yukinumata
0
1.1k
Open Source Summit Japan 2025のボランティアをしませんか
kujiraitakahiro
0
790
(キラキラ)人事教育担当のつらみ~教育担当として知っておくポイント~
masakiokuda
0
120
大学院進学について(2025年度版)
imash
0
110
実務プログラム
takenawa
0
11k
2025年度春学期 統計学 第13回 不確かな測定の不確かさを測る ー 不偏分散とt分布 (2025. 7. 3)
akiraasano
PRO
0
110
小さなチャレンジが生んだチームの大きな変化 -私のふりかえり探求の原点
callas1900
0
600
理想の英語力に一直線!最高効率な英語学習のすゝめ
logica0419
6
310
Sponsor the Conference | VizChitra 2025
vizchitra
0
590
検索/ディスプレイ/SNS
takenawa
0
12k
アントレプレナーシップ教育 ~ 自分で自分の幸せを決めるために ~
yoshizaki
0
150
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
The Invisible Side of Design
smashingmag
301
51k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
[RailsConf 2023] Rails as a piece of cake
palkan
56
5.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.5k
Raft: Consensus for Rubyists
vanstee
140
7.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Side Projects
sachag
455
43k
Building an army of robots
kneath
306
45k
4 Signs Your Business is Dying
shpigford
184
22k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Transcript
1 20 再帰呼び出し プログラミング基礎同演習 慶應義塾大学理工学部物理情報工学科 渡辺
2 20 本講義で学ぶこと 再帰呼び出し
3 20 再帰とは 再帰的定義:定義の記述に自分自身があらわれるもの フォルダ:その中にフォルダとファイルを含むもの A B B X Y
Z
4 20 プログラムにおける再帰呼び出しとは ある関数が、自分自身を呼び出すこと def func(): func() 上記のプログラムは、funcがfuncを呼び、呼び出さ れたfuncがまたfuncを呼び…と、実行が終わらない 再帰呼び出しには、必ず終端条件が必要
5 20 再帰の例:階乗 自然数の階乗を返す関数fact(n)が作りたい def fact(n): a = 1 for
i in range(1, n+1): a *= i return a 以下のようにループを回してしまうのが簡単だが、再帰で考えてみる
6 20 再帰三カ条 1. 再帰とは、自分自身を呼び出す関数である 2. 関数の最初に「終端条件」を記述する 3. 「解きたい問題より小さな問題」に分解して 自分自身を呼び出す
※必ずしも上記に当てはまらない再帰もあるが、まずはこれが基本だと覚えること
7 20 再帰の考え方 「今解きたい問題よりも小さな問題の答えが全 てわかっている場合、解きたい問題の答えはど う記述できるだろうか?」 nの階乗fact(n)について、fact(n-1)の答えがわかっているなら、 fact(n) = n
* fact(n-1) 階乗の場合: fact(n) fact(n-1)
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)まで考えても結果は同じ ここでおしまい
9 20 再帰の終端条件 def fact(n): if n == 1: return
1 return n * fact(n-1) 終端条件は(原則として)関数の最初に記述する 終端条件
10 20 再帰三カ条 階乗を計算する関数 def fact(n): if n == 1:
return 1 return n * fact(n-1) 1. 定義中に自分自身を呼び出している 2. 関数の最初に終端条件がある 3. 「より小さな問題」として自分を呼びだす 1. 再帰とは、自分自身を呼び出す関数である 2. 関数の最初に「終端条件」を記述する 3. 「解きたい問題より小さな問題」に分解して自分自身を呼び出す
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 再帰は「行って帰って」来る
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
13 20 課題1:階段の登り方問題 3 = 1 + 1 + 1
3 = 1 + 2 3 = 2 + 1 n段の階段を1段もしくは2段を混ぜて登る時、何通りの登り方があるか? n段の階段の登り方の数を返す関数 kaidan(n)が欲しい
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
15 20 課題1:階段の登り方問題 再帰の考え方 「今解きたい問題よりも小さな問題の答えが全 てわかっている場合、解きたい問題の答えはど う記述できるだろうか?」 階段を登り切る時は、最後に1段登る場合と2段登る場合がある n n-1
n-2 n n-1 n-2 kaidan(n) = kaidan(n-1) + kaidan(n-2)
16 20 課題1:階段の登り方問題 再帰呼び出しには、必ず終端条件が必要 階段の段数が1段や2段の場合には値を返す def kaidan(n): # 終端条件 if
条件: return 値 # 再帰部分 return 自分自身を使った式 最終的に関数はこんな形になる 終端条件が二つあることに注意すること
17 20 課題2:迷路の解法 迷路が与えられた時、スタートからゴールまでの道を知りたい • とりあえず進んで見る • 分かれ道に来たら、現在位置を覚えて適当に進む • もし行き止まりなら、先程の場所まで戻って別の道を試す
基本的なアルゴリズム このように「とりあえず試して、ダメならやりなおす」 というアルゴリズムをバックトラックと呼ぶ
18 20 バックトラック とりあえず片方を試してみて、ダメなら戻る 1 2 3 4 5 6
7 将棋や囲碁の思考ルーチンに使われる 数独等では「仮置き」と呼ばれる
19 20 迷路の解き方(矢印版) 1. 分かれ道に来た 2. とりあえず片方に進んで見る 3. 行き止まりだったので戻る 4.
まだ試してない道があれば進む
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. スタート地点まで到達したら完成