2017-07-14 10 views
1

以下のコードはPythonのquicksortです。 アルゴリズムで比較演算が何回実行されたのかを数えます。再帰関数を数えるには?

私はcount = 0を割り当てますが、再帰のため0にリセットされます。

def QuickSort(lst): 
    if len(lst) > 1: 
     pivot_idx = len(lst) // 2 
     smaller_nums, larger_nums = [], [] 

     for idx, num in enumerate(lst): 
      if idx != pivot_idx: 
       if num < lst[pivot_idx]: 
        smaller_nums.append(num) 

       else: 
        larger_nums.append(num) 

     QuickSort(smaller_nums) 
     QuickSort(larger_nums) 
     lst[:] = smaller_nums + [lst[pivot_idx]] + larger_nums 

    return lst 
+1

カウントはどこに割り当てられますか? –

+0

def QuickSort(lst)の直後: –

+0

ここに投稿したコードではどこにも表示されません... – SwiftsNamesake

答えて

1

パスを:、私はそれが間違っていたと思ったので、

def QuickSort(lst, count=0): 
    if len(lst) > 1: 
     pivot_idx = len(lst) // 2 
     smaller_nums, larger_nums = [], [] 

     for idx, num in enumerate(lst): 
      if idx != pivot_idx: 
       if num < lst[pivot_idx]: 
        smaller_nums.append(num) 

       else: 
        larger_nums.append(num) 

     count = QuickSort(smaller_nums, count+1)[1] 
     count = QuickSort(larger_nums, count+1)[1] 
     lst[:] = smaller_nums + [lst[pivot_idx]] + larger_nums 


    return (lst,count) 
+0

私はあなたが私が尋ねたものを理解したと思います。それは私をたくさん助けます!ありがとう、ジェイ! –

+0

@WonKim問題ありません!これが助けられたら受け入れてupvoteしてください:) –

+0

コードの上に上向きの矢印がありますか?私は初心者です。あなたの助けをどう受け入れることができますか? –

-2

グローバル変数としてカウントを割り当て、ゼロに設定します。つまり、関数の定義外にcount=0を設定し、比較するたびにインクリメントします。パラメータとして再帰的

+0

それは本当に悪い考えです。 – SwiftsNamesake

+0

実際、私はグローバル変数を使わないようにしてきました。 –

+0

@SwiftsNamesakeなぜこれは悪い考えですか? – salparadise

3

編集は、私はこの答えを消去しましたが、私は示唆したように、それはすべての

後に正しかったと思います関数がステートレスであれば、より良いと思う: あなたは1番目と呼び出し回数を返すことができる:

def QuickSort(lst, ncalls=0): 
    ncalls += 1 

    if len(lst) > 1: 
    pivot_idx = len(lst) // 2 
    smaller_nums, larger_nums = [], [] 

    for idx, num in enumerate(lst): 
     if idx != pivot_idx: 
      if num < lst[pivot_idx]: 
       smaller_nums.append(num) 

      else: 
       larger_nums.append(num) 
    lst1, ncalls = QuickSort(smaller_nums, ncalls) 
    lst1, ncalls = QuickSort(larger_nums, ncalls) 
    lst[:] = smaller_nums + [lst[pivot_idx]] + larger_nums 



    return lst,ncalls 


QuickSort([1,3,52,4,6,5]) 
=> [1, 3, 4, 5, 6, 52],7