質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

8686閲覧

クラス内の関数の再帰について

akayon

総合スコア32

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/26 08:37

編集2018/03/26 08:41

このコードを実行結果での return 3 となった後の処理についてで

  1. なぜ関数再帰が終わったあと under という行だけが実行されるのか
  2. なぜ self.d の値が減っていくのか

を教えていただきたいです。

class k(): def __init__(self,maxd): self.maxd = maxd def func(self,d_): self.d = d_ print("upper",self.d) if self.maxd == self.d: print("return",self.d) return insta = k(self.maxd) insta.func(d_+1) print("under",self.d) p= k(3) p.func(0)

upper 0
upper 1
upper 2
upper 3
return 3
under 2
under 1
under 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

クラスを用いると表面上ややこしく映るので、普通の再帰関数を観察してみましょう。

Python

1max_d = 3 2def func_recursive(d): 3 print("upper", d) 4 5 if max_d == d: 6 print("return", d) 7 return 8 9 func_recursive(d+1) 10 print("under", d) 11 12func_recursive(0)

実行結果は同じです。

plain

1upper 0 2upper 1 3upper 2 4upper 3 5return 3 6under 2 7under 1 8under 0

そして次のサイトでプログラムの流れを観察してみましょう。
Visualize Python, Java, JavaScript, TypeScript, and Ruby code execution
Back/Forward ボタンを押すことによって、処理を 戻したり/進めたり できます。


スタックに計算結果を積んでいくイメージさえわかれば、
クラスを用いた場合の挙動も理解できるかと思います。

投稿2018/03/26 08:56

編集2018/03/26 08:59
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜ関数再帰が終わったあと under という行だけが実行されるのか

print("under",self.d)

という行の上の実行は、それまでにすべて済んでいるからです。insta.func(d_+1)の瞬間に新たな関数呼び出しが発生し、それが終了すると上記行が実行されるという仕組みです。

なぜ self.d の値が減っていくのか

そう見えるようにprintされているだけ、というのがミソです。インクリメントしか行っていないので、self.dの値は基本的には増えていく一方です。
ただ、self.dがmaxdに達した関数から先に返り、それが返って次の関数も玉突き式に・・・という風に処理が終わるので、その過程で値が減っていくように見える訳です。

似たような例でこういうのもあります。
※文字列を反転させて返す。

python

1>>> def reverse_string(string): 2... if string != "": 3... s = reverse_string(string[1:]) # string[1:]は先頭を一文字削った文字列。スライスを使っています 4... return s + string[0] 5... else: 6... return "" 7... 8>>> reverse_string("hogehoge") 9'egohegoh'

投稿2018/03/26 10:37

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問