Pythonでアルゴリズム「クイック・ソート」(8):再帰処理、左グループと右グループどっちが先なの?
こんにちは!今回も「クイックソート」の続きです。そして、その「クイックソート」のコードの核である。「再帰処理」についてお話しさせてください!
「再帰関数」とは?
前回の記事までで、次の図のとおり、外側ループ1回目を完了させました。
値「6」の位置は確定し、その左側に「6」より小さい値、その右側には「6」より大きい値が存在しています。しかし、並べ替えは完了していませんね…。
ここは、何度かループさせて、リスト全体の要素を並べなくては…と思いますね。これ以降For文もWhile文もございません。次のような見慣れないIf文が2つ現れます。
「あれ、If文の処理部で、この関数自身を呼び出しています。🤔」
いいところに目を付けましたね!(打ち合わせ通りの発言ありがとうございます🧡)。まさに、ここのコードが、まさに再帰させる、すなわち、「再び帰らせる」命令をしているんです。自分自身を関数中で呼び出す関数のことを、「再帰関数」といいます。
「Left-1」は、確定した値の左隣り
それでは、具体的に、再帰を行うコードを見てみましょう!😆
まず、ループが終わったところでの、leftとrightの位置を確認しておきます。次の通りです。
「ああ、すれ違っちゃったんですね。🤔」
はい。leftとrightの位置関係が逆転している状態でループが止まってしまいました。そして、今回取り組むのは次のコードです。
「うーん、leftの左側とrightの右側、それぞれの位置が登場しますね。😮」
そうです!これがそれぞれどこを指しているか、を示すと次のとおりです。
ここでは、まず「left-1」が現れる一つ目のif文の条件式に着目しましょう!
左側の要素グループが先に整列対象になる
次の図の赤枠で囲まれているifの条件式ですが、これは一体何を言っているんでしょうね。
「left-1が示す位置が、ループの開始位置よりも大きいという条件を示しているようです。🤔」
ということは、startNumは「0」、left-1は「4」でしたから、再帰させる処理部は実行されますね。何が実行されますか?
「開始位置は「0」のまま、終了位置は「left-1」にして、再び関数が最初から実行されます。」
はい!では、それを絵にすることこうなります!
「おお、確定した『6』の左側のグループが今度は処理対象となるのですか!😄」
そうなんです!まずは、リスト全体を大きなグループとして処理しました。続いて、確定した値の「左側」にある値すべてを一つのグループとして処理するんです。
ということで、再帰処理のご紹介でした。次回(まは次々回で)完了させましょう。
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと、私が喜びます!🙇。
この記事が気に入ったらサポートをしてみませんか?