2016-05-12 10 views
0

私は数を乗算し、それらが回文かどうかを確認するために必要な数学の問題をやっています。なぜ私のpythonプログラムは永遠に動かないのですか? "予期せず終了する"

import sys 
sys.setrecursionlimit(1000000) 
import time 

def values(): 
    x=999 
    y=999 
    product=0 
    generator(x,y,product) 

def generator(x,y,product): 
    while x >= 900: 
     product=x*y 
     strp=str(product) 
     check=strp[::-1] 
     print (check) 
     time.sleep(0.1) 
     if strp==check: 
      print ("done") 
     x=x-1 
    else: 
     y=y-1 
     generator(x,y,product) 

values() 

私は、Macを使っていて、それがループを数回行くが、その後「Pythoが予期せず終了」エラーが表示されます。

+3

なぜ再帰を使用するのですか?そして、なぜ 'time.sleep()'コール? – TigerhawkT3

+0

私はそれを行う別の方法はありませんか? time.sleep()呼び出しは問題ではなく、プログラムが実行を停止した場所が変更されたかどうかを確認しようとしたものです。 –

+0

また、何も返すことはありません。 – TigerhawkT3

答えて

1

再帰ループが停止しないため、プログラムがクラッシュしています。 x900の値に達すると、generate関数は常にそのコードのelseブランチを呼び出します。あなたは、ループが停止する条件を追加することに敬意を表します。それ以外の場合は、メモリがいっぱいになり、再帰ループに何回コールするかという制限があるため、プログラムがクラッシュします。

+0

しかし、ループを止めたくないのですか?なぜそれはちょうど続けることができないのですか? –

+0

あなたは永遠に実行されるスクリプトをしたいですか?何が良い? – IanAuld

+0

プログラムがクラッシュするのは、再帰呼び出しを行うたびに関数がスタック(メモリ内)に追加されるためです。無限再帰呼び出しを行うことができないため、プログラムがクラッシュすることがあります。これはあなたのコードの問題です。私はあなたのコードで何をしようとしているのか本当に分かりませんが、達成したいことを正確に再定義する必要があります。 – ShadowMitia

0

上記の答えによると、x = 900になると、常にelseコードを呼び出すことによって再帰が繰り返されるため、再帰は決して止まらない。

私は、次の解決策を提案します。xが900になるまでa)は、あなたが999でyを維持するのに興味があるなら し、それが900になるまで、あなたの他に以下を追加する必要がありyは減少(すなわち999x999、999x998を行います。.. 。999x900 ... 998x900 ... 900 X 900):

else: 
    if y >= 900: 
     generator(x,y,product) 
     y=y-1 

B)あなたは(すなわち、それらを並行して減少する)それらの両方に再帰的にしたい場合:

def generator(x,y,product): 
    if x >= 900 and y >=900: 
     product=x*y 
     strp=str(product) 
     check=strp[::-1] 
     print (check) 
     time.sleep(0.1) 
     if strp==check: 
      print ("done") 
     x=x-1 
     y=y-1 
     generator(x, y, product) 

を個人的に私はなり2番目の解決策をもっと賢明にすることをお勧めします。

両方のループで再帰するときにwhileループを使用する必要がないことに注意してください。ifチェックで十分です。

関連する問題