2017-01-17 6 views
0

これは反転をカウントするために調整されるマージソートです。私のコードは奇妙なエラーを投げます (私はpython 3.xを学ぶためにalgosを実装しています)。予想される値の数を明示的に返すにもかかわらず、なぜ 'valueError'が返されますか?

In line 11,

in merge_sort first_sorted_half, x = merge_sort(arr[:half])
[Previous line repeated 12 more times] ValueError: not enough values to unpack (expected 2, got 1)

明示的に2つの値を返しますが、私はPython 3の新機能ですので、ここで何が起こっているのか正確に理解したいのですが、どこでも同じような問題を見つけることはできません。これに関する詳細については、Pythonのドキュメントへのリンクもありがとう!

def merge_sort(arr): 
    if len(arr) <= 1: 
     return arr 
    half = int(len(arr)/2) 
    first_sorted_half, x = merge_sort(arr[:half]) 
    second_sorted_half, y = merge_sort(arr[half:]) 
    merged_halves, z = merge(first_sorted_half, second_sorted_half) 

    return merged_halves, x + y + z 


def merge(first_half, second_half): 
    n = len(first_half) + len(second_half) 
    i = 0 
    j = 0 
    split_inversions = 0 
    ans = [] 
    for k in range(n): 

     if i >= len(first_half): 
      ans.append(second_half[j]) 
      j += 1 
      continue 
     if j >= len(second_half): 
      ans.append(first_half[i]) 
      i += 1 
      continue 

     if first_half[i] > second_half[j]: 
      ans.append(second_half[j]) 
      j += 1 
      split_inversions += len(first_half) - i 
     elif first_half[i] < second_half[j]: 
      ans.append(first_half[i]) 
      i += 1 

    return ans, split_inversions 


numbers = [3,2,1,4,5,6,8,10,9] 
print(merge_sort(numbers)) 

答えて

0

あなたが取得しているエラーは、プログラムがその再帰呼び出し12回実行することを言い、最後にそれが結果を解凍できませんでした。

これは、merge_sortから2つの値を返すことを期待しています。結果をfirst_sorted_halfxに解凍することになります。ただし、条件len(arr) <=1からarrのみを返すと、解凍する値はなく、配列のみが存在します。

これは、基本ケースの値を返す方法です(return arr, len(arr)など)。

+0

感謝!!これは多くの助けになりました! –

0

ilke444は正しいですが、もう少し明確にする必要があります。開始するには:データ変数を返すことが必要ですが、私はlen(arr)< = 1についてよく分かりませんが、私はstackflowにはかなり新しいです。私はPython 3のこの機能について知らないのです。私はPygame/standardパッケージ。

この「コードスニペット」の最初のものは、定義されていません。および/または定義する必要があります。あなたが知っているようにLenは長さを表し、それを使用するには引用符( '')を使用します。そのよう :

len('arr') 

は印刷されます:

3 

をこのセットの3つの文字があるため。構文が少し違うので、あなたが言ったように、Python 3の新機能は明らかです。

これはおそらく最初のビットのみを解決するので、この情報で私はあなたに1つの事をもっと残すでしょう。 {()、 リストには()の代わりに角括弧が付きます。 辞書には、角括弧で囲まれていない限り、変数定義または関数のいずれかで定義が必要です。

おかげで、 ジェリー

+0

そして、本当に奇妙な方法で文法エラーを起こしているかもしれません。 – JerryPlayz101

+0

本当に、arrは私のリストの変数名です。私がしなければならなかった唯一の変更は、私の基本ケース(len(arr)<= 1)のためにreturn arr、0でした。 –

関連する問題