2
def my_sort(array):
    length_of_array = range(1, len(array))
    for i in length_of_array:
        value = array[i]
        last_value = array[i-1]
        if value<last_value:
            array[i]=last_value
            array[i-1]=value
            my_sort(array)
    return array

私は関数が一般的に何をするかを知っています。そのソートアルゴリズム....しかし、個々の部分/セクションがどのように機能するかはわかりません。

4

2 に答える 2

3

これを理解する最善の方法は、実際に使ってみて、何を使っているかを学び、基本的に Python を学ぶことだと言わざるを得ません。:)

ただし、役立つように、行を 1 つずつ見ていきます。

  1. という名前の引数を 1 つ受け入れる関数という名前を定義します。残りの行は、この関数に含まれています。my_sortarray

  2. 包括的から非包括的の長さまでの範囲を使用rangeして、数値の範囲を作成します。次に、この範囲を変数に割り当てます。1arraylength_of_array

  3. 前の行で定義された範囲を反復するfor ループを開始します。さらに、返された各数値を変数に代入しますi。この for ループは、4 行目から 9 行目を囲んでいます。

  4. position でのインデックス付けvalueによって返されるアイテムと等しい変数を作成します。 arrayi

  5. position でlast_valueのインデックス付けによって返されるアイテムと等しい変数を作成します。arrayi-1

  6. valueより小さいかどうかをテストしlast_valueます。その場合は、7 行目から 9 行目を実行します。

  7. iインデックスをarray等しくしlast_valueます。

  8. i-1インデックスをarray等しくしvalueます。

  9. 引数を渡して、my_sort 再帰的に再実行しますarray

  10. array再帰関数のこの反復の戻り。

array最終的にソートされると、再帰が終了し、arrayすべてのナイスでソートされた状態が残ります。

これが主題に光を当てることを願っています!

于 2013-11-15T03:05:15.460 に答える
0

私はあなたのために何ができるか見てみましょう。参照用のコード:

def my_sort(array):
    length_of_array = range(1, len(array))
    for i in length_of_array:
        value = array[i]
        last_value = array[i-1]
        if value<last_value:
            array[i]=last_value
            array[i-1]=value
            my_sort(array)
    return array

def my_sort(array): 引数として配列を取る関数。

length_of_array = range(1, len(array))の項目数に基づいて、反復可能な数値 の に変数を設定しlength_of_arrayます。何が何をするのか知っていると思いますが、そうでない場合は、要するに、リストを反復処理するのと同じ方法で反復処理できます。(ここでも使えます。)rangearrayrangexrange()

for i in length_of_array:
    value = array[i]
    last_value = array[-1]

ここで行っているのは、 を使用しrangeて間接的に配列をトラバースすることです。これは、それぞれの項目の合計が同じであるためです。しかし、よく見ると、は 1 から始まるインデックスとして をvalue使用しているため、実際には array[1] であり、orです 。ivaluelast_valuearray[1-1]array[0]

    if value<last_value:
        array[i]=last_value
        array[i-1]=value

ですから、値を比較しています。を渡したとしましょう[3, 1, 3, 2, 6, 4]。ループの最初の反復にいるので、基本的にarray[1]は、1 である が 3 である より小さい場合array[0]、それらを交換します。もちろん、1 は 3 より小さいので、交換します。ただし、コードは各項目を前の項目と比較することしかできないため、array最低から最高の順に正しく並べ替えられるという保証はありません。後続のアイテムが大きい場合、各反復は適切にスワップされたアイテムのスワップを解除する可能性があります (たとえば、[2,5,6,4] は最初の 2 つの反復で同じままになります。ifテストではスキップされますが、 3 番目に当たると、6 は 4 と入れ替わりますが、これはまだ間違っています)。実際、これをmy_sort(array)直下の呼び出しなしで終わらせるとしたら、array[1, 3, 2, 3, 4, 6]. 正しくありません。

        my_sort(array)

したがって、my_sort()再帰的に呼び出します。私たちが基本的に言っていることは、最初の反復で何かが間違っている場合は、それを修正してから、新しいものarrayを に戻すということmy_sort()です。これは最初は奇妙に聞こえますが、うまくいきます。テストがまったく満たされない場合if、それは元のリストの各項目が次の項目よりも小さかったことを意味します。これは、最初から昇順で並べ替えられていたことを示す別の方法 (実際にはコンピューターの方法) です。それが鍵です。したがって、いずれかのリスト項目が前の項目よりも小さい場合、1 インデックス左に移動します。しかし、それが正しいかどうかはわかりません。おそらく、さらに先に進む必要があります。そのため、最初に戻って (つまり、my_sort()再び新しく作成されたリストに追加されます)、もう一度左に引っ張る必要があるかどうかを再確認します。それができない場合if、次のエラーが発生するまで、テストは失敗します (各項目は次の項目よりも小さくなります)。反復ごとに、これは正しい位置に来るまで、同じ小さい数値を 1 つのインデックスだけ左に動かします。これは実際よりもややこしく聞こえるので、各反復の出力を見てみましょう。

[3, 1, 3, 2, 6, 4]
[1, 3, 3, 2, 6, 4]
[1, 3, 2, 3, 6, 4]
[1, 2, 3, 3, 6, 4]
[1, 2, 3, 3, 4, 6]

何が起こっているか見てますか?各反復で何が変化しているかだけを見るとどうなるでしょうか。

[3, 1, ...          # Wrong; swap. Further work ceases; recur (return to beginning with a fresh call to my_sort()).
[1, 3, 3, 2, ...    # Wrong; swap. Further work ceases; recur
[1, 3, 2, ...       # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 6, 4   # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 4, 6]  # All numbers all smaller than following number; correct.

これにより、関数は、後ろから前に数値をプルするのに必要な回数だけ自分自身を呼び出すことができます。繰り返しになりますが、呼び出されるたびに、最初の間違ったインスタンスに焦点を当て、適切な位置に配置されるまで 1 つ左に引っ張ります。それが役立つことを願っています! 問題が解決しない場合はお知らせください。

于 2013-11-16T12:09:31.377 に答える