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
2k
再帰呼び出し / Python Recursion
プログラミング基礎同演習
kaityo256
PRO
November 14, 2023
Tweet
Share
More Decks by kaityo256
See All by kaityo256
モンテカルロ法(3) 発展的アルゴリズム / Simulation 04
kaityo256
PRO
4
1.2k
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
4
1.7k
SSH公開鍵認証による接続 / Connecting with SSH Public Key Authentication
kaityo256
PRO
3
420
論文紹介のやり方 / How to review
kaityo256
PRO
15
82k
デバッグの話 / Debugging for Beginners
kaityo256
PRO
10
1.5k
ビット演算の話 / Let's play with bit operations
kaityo256
PRO
6
500
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
15
5.2k
制限ボルツマンマシンの話 / Introduction of RBM
kaityo256
PRO
3
1.2k
論文の読み方 / How to survey
kaityo256
PRO
223
170k
Other Decks in Education
See All in Education
AIC 103 - Applications of Property Valuation: Essential Slides
rmccaic
0
130
生成AI
takenawa
0
290
FinOpsスキルの効率的な上げ方 #ochacafe
chacco38
1
170
The Art of Note Taking
kanaya
1
120
Are puppies a ranking factor?
jonoalderson
0
470
Tangible, Embedded and Embodied Interaction - Lecture 7 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
1.6k
Data Processing and Visualisation Frameworks - Lecture 6 - Information Visualisation (4019538FNR)
signer
PRO
1
2.4k
プレゼンテーション実践
takenawa
0
230
社外コミュニティと「学び」を考える
alchemy1115
2
130
横浜翠嵐高校 職業講話 / Talk for YOKOHAMA SUIRAN 2024
mura_mi
0
190
子どものためのプログラミング道場『CoderDojo』〜法人提携例〜 / Partnership with CoderDojo Japan
coderdojojapan
4
16k
プロダクト部門のマネージャー全員でマネジメントポリシーを宣言した記録_-_EMConf_JP_2025.2.27.pdf
stanby_inc
1
2.2k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
A Modern Web Designer's Workflow
chriscoyier
693
190k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Bash Introduction
62gerente
613
210k
BBQ
matthewcrist
88
9.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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. スタート地点まで到達したら完成