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
1.7k
再帰呼び出し / Python Recursion
プログラミング基礎同演習
kaityo256
PRO
November 14, 2023
Tweet
Share
More Decks by kaityo256
See All by kaityo256
デバッグの話 / Debugging for Beginners
kaityo256
PRO
8
640
ビット演算の話 / Let's play with bit operations
kaityo256
PRO
4
180
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
15
4.8k
制限ボルツマンマシンの話 / Introduction of RBM
kaityo256
PRO
3
740
論文の読み方 / How to survey
kaityo256
PRO
220
150k
リンゴゲームと貧富の差 / Origin of the disparity of wealth
kaityo256
PRO
14
14k
渡辺研Slackの使い方 / Slack Local Rule
kaityo256
PRO
9
8.4k
時間の矢について / Time's arrow
kaityo256
PRO
12
17k
t-SNEをざっくりと理解 / Overview of t-SNE
kaityo256
PRO
2
1.2k
Other Decks in Education
See All in Education
技術を楽しもう/enjoy_engineering
studio_graph
1
390
ACT FAST 20240830
japanstrokeassociation
0
160
英語学習から海外発表までの流れ
yasulab
18
4.1k
week10@tcue2024
nonxxxizm
0
530
Amazon Connectを利用したCloudWatch Alarm電話通知
junghyeonjae
0
190
Kindleストアで本を探すことの善悪 #Izumo Developers' Guild 第1回 LT大会
totodo713
0
110
Lisätty todellisuus opetuksessa
matleenalaakso
1
2.2k
【基本】Oracle Database データベース・ユーザー・セキュリティ入門
oracle4engineer
PRO
1
820
"数学" をプログラミングしてもらう際に気をつけていること / Key Considerations When Programming "Mathematics"
guvalif
0
510
アニメに学ぶチームの多様性とコンピテンシー
terahide
0
140
不登校予防・再登校支援プログラムを提供するToCo (トーコ) の会社紹介資料 toco.mom
toco3week
0
270
勉強する必要ある?
mineo_matsuya
2
640
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
43
13k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
RailsConf 2023
tenderlove
28
850
Pencils Down: Stop Designing & Start Developing
hursman
119
11k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
110
6.9k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Docker and Python
trallard
40
3k
Thoughts on Productivity
jonyablonski
67
4.2k
Why Our Code Smells
bkeepers
PRO
334
57k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Being A Developer After 40
akosma
84
590k
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. スタート地点まで到達したら完成