2017-08-14 15 views
-2

私は再帰を使用してコードを記述しましたが、後で深さが高すぎると認識し、より高いレベルの入力値では機能しません。それは問題なく完全に正常に動作します。forループではなく、forループでの作業

def checkCount(first_window, index=0,reference_list=None): 
    reference_list = [] 
    count = 0 
    while index<=len(first_window)-2: 
     if first_window[index] < first_window[index+1]: 
      index += 1 
      count += 1 
     else: break 
    if count != 0: 
     reference_list.append(int((count*(count+1))/2)) 

    count = 0 
    while index <= len(first_window)-2: 
     if first_window[index] > first_window[index+1]: 
      index += 1 
      count += 1 
     else: break 
    if count != 0: 
     reference_list.append(-int((count*(count+1))/2)) 

    if index > len(first_window)-2: return reference_list 
    elif first_window[index] == first_window[index+1] and index<len(first_window)-2: index += 1 

    reference_list = reference_list + checkCount(first_window, index, reference_list) 
    return reference_list 

import random 
import time 
start = time.clock() 
input_array = list(map(int,"188930 194123 201345 154243 154243".split(" "))) 
input_array = random.sample(range(1,100),10) 

def main(): 

    N = len(input_array) 
    K = 8 
    if K == 1: return None 

    print("Input array: ",input_array) 
    print("First Window",input_array[:K]) 
    print("Real Output", checkCount(input_array[:K])) 
if __name__ == "__main__":main() 

再帰なしで試しても、無限ループで終了します。私はさまざまな方法を試みましたが、進歩はありませんでした。私が試してみました

一つの方法は、再帰文を取り出してreferencelist +インデックスを返して:

def checkCount(..): 
    .... 
    .... 
    return referencelist,index 



while index <= K-2: 
    print("While",index) 
    reference_list, index = checkCount(new_input, index=0, reference_list=[]) 
    referencelist += reference_list 

アプリケーションはhereに似ています。しかし、再帰が助けにならない膨大な量のデータを扱わなければなりません。入力配列が100,000より大きいとします。私は本当にここに打たれて、私はどの論理が欠けているのか分からない。どんな助けでも感謝します。

+0

これを簡略化できますか? [mcve]の作成方法を見てください。 –

+0

あなたの再帰は逆さまに見えます。 a)**端末条件**およびb)**作業負荷を軽減して関数を呼び出す**ゼロに減らしながら再考してみてください。 – quadruplebucky

+0

@quadruplebucky私が何をしても、最終的に大きな再帰の深さで終わり、Pythonは1000を超える深さの呼び出しをサポートしないので、再帰をあきらめました。インクリメンタルステップで再帰関数を呼び出そうとしましたが、他のメソッドでは複雑になりました。 –

答えて

2

first_window変数のみが読み込まれ、インデックス変数がインクリメントされます。再帰の必要はありません、単純なループが動作することができます。 len(first_window) - 2:もちろん

def check_count(first_window): 
    reference_list = [] 
    index = 0 
    while index < len(first_window) - 2: 
     count = 0 
     while index <= len(first_window) - 2: 
      if first_window[index] < first_window[index + 1]: 
       index += 1 
       count += 1 
      else: 
       break 
     if count != 0: 
      reference_list.append(int((count * (count + 1))/2)) 

     count = 0 
     while index <= len(first_window) - 2: 
      if first_window[index] > first_window[index + 1]: 
       index += 1 
       count += 1 
      else: 
       break 
     if count != 0: 
      reference_list.append(-int((count * (count + 1))/2)) 

     if index < len(first_window) - 2 and first_window[index] == first_window[index + 1]: 
      index += 1 

    return reference_list 

は、このアルゴリズムは、例えば、我々は次のように繰り返しを避けることができ、最適化することができます。

関連する問題