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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

815閲覧

関数ないでの挙動に関してアドバイスお願いします!

urazome

総合スコア26

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/02/08 13:58

2つ文字列が与えられます。1つ目は見本で、2つ目は、見本とは形が少し違うものです。2つ目の文字列を1つ目の文字列と同じにしたいのですが、左から右へしか動かすことはできないというルールがあります。例えば、abcをcabに直したいときは、abc->bca->cabとしなければなりません。そして最後に、最短で何回動かしたかを出力するのが目的となっています。以下のコードは、思考中だった時の失敗コードなのですが、2点だけわからないところがあります。
その内容は、
1.出力結果は4つ出てくると考えるのですが、結果は3つなのはなぜか。
2.出力されるtotalの最後が1と出力されるのは、なぜか。
です。
また、下記に私の考えを図にした写真を添付しました。

python

1r=[5, "APPLE", "LEAPP"] #左から、文字数、見本の文字、修正する文字 です。 2num=int(r[0]) 3total=0![イメージ説明](579b966b29c1558bdca0a87c0486de6c.jpeg) 4model=[] 5target=[] 6for i in range(num): 7 model.append(r[1][i]) 8 target.append(r[2][i]) 9def sorten(total): 10 for i in range(num): 11 #print(total) 12 #print(target)  13 if model[i]!=target[i]: 14 moji=target[0] 15 target.pop(0) 16 target.append(moji) 17 #print(target) 18 total+=1 19 sorten(total) 20 print(total) 21sorten(total)

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数の中で、その関数それ自身を呼び出すことを「再帰」といいます。
そこで、最初の「sorten」の呼出しを「再帰前のsorten」と、その中での「sorten」の呼出しを「再帰1回目のsorten」などと呼んで説明していきます。

① 再帰前のsorten
最初のfor で、i0 です。
target['L', 'E', 'A', 'P', 'P'] です。
model[0]Aで、target[0]Lなので、ifのボディの部分が実行されます。
その結果、target['E', 'A', 'P', 'P', 'L']に、total1になって、「再帰1回目のsorten」に突入します。

② 再帰1回目のsorten
i0で、target[0]Eです。Aではないので、ifのボディが実行されます。
その結果、target['A', 'P', 'P', 'L', 'E']に、total2になって、「再起2回目のsorten」に突入です。

③ 再帰2回目のsorten
i0で、target[0]Aなので、ifのボディは実行されず、sortenの最後の行のprint(total)がようやく実行されます。
total2だったので、2が表示され、「再帰2回目のsorten」は終了します。
そして、中断していた「再帰1回目のsorten」の続きを行います。

④ 再帰1回目のsortenの続き
i1になって、forのボディを実行します。
target['A', 'P', 'P', 'L', 'E']なので、target[1]Pです。
model[1]Pなので、ifのボディは実行されず、print(total)が実行されます。
「再帰1回目のsorten」の中で、total2になっていたので、2が表示され、「再帰1回目のsorten」は終了します。
そして、中断していた「再帰前のsorten」を再開します。

⑤ 再帰前のsortenの続き
i1になって、forのボディを実行しますが、target['A', 'P', 'P', 'L', 'E']なので、ifのボディは実行されず、sorten最後の行のprint(total)が実行されます。
「再帰1回目のsorten」に突入するときのtotsl1でしたから、ここでは1が表示され、「再帰前のsorten」も終了します。

sortenの仮引数であるtotalはローカルな変数なので、関数の途中で中断して再起に突入した場合、再帰の中でtotalの数が増えても、中断したところに戻って再開したら、totalの値は、中断前の値で再開されるのです。
グローバルなtargetとの違いです。

⑥ まとめ
以上から、出力の数は3つで、最後の出力は1になります。

投稿2019/02/08 15:23

kts_h

総合スコア207

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

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

urazome

2019/02/09 04:42

回答ありがとうございます! targetがグローバル変数であることを失念していました! スッキリしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問