-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より大きいとします。私は本当にここに打たれて、私はどの論理が欠けているのか分からない。どんな助けでも感謝します。
これを簡略化できますか? [mcve]の作成方法を見てください。 –
あなたの再帰は逆さまに見えます。 a)**端末条件**およびb)**作業負荷を軽減して関数を呼び出す**ゼロに減らしながら再考してみてください。 – quadruplebucky
@quadruplebucky私が何をしても、最終的に大きな再帰の深さで終わり、Pythonは1000を超える深さの呼び出しをサポートしないので、再帰をあきらめました。インクリメンタルステップで再帰関数を呼び出そうとしましたが、他のメソッドでは複雑になりました。 –