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

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

新規登録して質問してみよう
ただいま回答率
85.35%
再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

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

Q&A

解決済

3回答

1280閲覧

クイックソート、再帰関数での戻り値

Giovannaaa

総合スコア10

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

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

0グッド

0クリップ

投稿2021/11/24 15:35

このコードでのクイックソートについて質問です。sort()にdataが渡されて初めてfor文の処理が終わった後、left=[1,3,2,4,2,1]right=[]middle=[5]になるなど再帰関数が終わるまでの処理、そして、その後5は出てこないことも分かります。ここで質問なのですが、この5などmiddleに入った値をどのように最終的にクイックソートしたリストで戻り値として返してくるのかが分からないです。最初にでていった5はどこにいくのでしょうか。説明文が分かりにくくすみません。よろしくお願いします。

python

1def sort(data): 2 n = len(data) 3 pivot = data[n//2] 4 left,right,middle = [],[],[] 5 for i in range(n): 6 if data[i] < pivot: 7 left.append(data[i]) 8 elif data[i] > pivot: 9 right.append(data[i]) 10 else: 11 middle.append(data[i]) 12 print("left = ",left) 13 print("right=",right) 14 print("middle= ",middle) 15 print("-----------") 16 if left: 17 left = sort(left) 18 if right: 19 right = sort(right) 20 return left + middle + right 21 22data = [1,3,2,5,4,2,1] 23data = sort(data) 24print(data)

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

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

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

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

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

guest

回答3

0

middleに入った値をどのように最終的にクイックソートしたリストで戻り値として返してくるのか

ppaulさんの回答と同じですが、最後の処理

python

1 if left: 2 left = sort(left) 3 if right: 4 right = sort(right) 5 return left + middle + right

で、left は ソート済みのleftに入っていもの、rightはソート済みのrightに入っているものになり、

最後のreturnのところで、left 、 middle、 right の順につなげているからです。

投稿2021/11/25 01:01

TakaiY

総合スコア13790

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

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

Giovannaaa

2021/11/25 05:14

ありがとうございました。
guest

0

ベストアンサー

Visualize Python, Java, JavaScript, C, C++, Ruby code execution というサイトがあります。

ここのテキストボックスに Python スクリプトを貼り付けて Visualize Execution をクリックすると、スクリプトがステップ実行されてリストの内容の変化を視覚的に眺めることができます。

掲題のスクリプトは再帰関数なので 208 ステップにもなりますが、参考にしてみて下さい。

投稿2021/11/24 16:51

melian

総合スコア20655

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

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

Giovannaaa

2021/11/25 05:15

ありがとうございました。
guest

0

リストの和をreturnしているからです。
リストの和とは以下のようなものです。

python

1>>> left=[1,3,2,4,2,1] 2>>> right=[] 3>>> middle=[5] 4>>> 5>>> print(left + middle + right) 6[1, 3, 2, 4, 2, 1, 5]

リストの和については、公式ドキュメント チュートリアル 3.1.3. リスト型 (list)公式ドキュメント シーケンス型 --- list, tuple, rangeをお読みください。

投稿2021/11/24 15:53

編集2021/11/24 15:57
ppaul

総合スコア24670

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

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

Giovannaaa

2021/11/24 16:17

回答ありがとうございます。リストの和は分かったのですが、1回目のif left:で[1,3,2,4,2,1]がsort(left)に入ると思うのですがここで5がなぜ関数が終わったあとに戻り値で返されるのかわからないです。すみません。
Giovannaaa

2021/11/25 05:15

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問