2016-05-12 2 views
0

これは初めてのことですが、なぜこれが起こるのか分かりません。 私はこのプログラムを実行しようとしています:シンプルなプログラムを実行しているときに "Traceback"エラーが表示される

  NumberToCheck=0 
      check=2 

      def checker(): 
       global NumberToCheck 
       global check 
       check=2 
       while check < NumberToCheck: 
        if NumberToCheck % check == 0: 
         main() 
        check=check+1 
       else: 
        divider() 

      def main(): 
       global NumberToCheck 
       while NumberToCheck < 600: 
        NumberToCheck=NumberToCheck+1 
        checker() 

      def divider(): 
       if 600851475143 % NumberToCheck == 0: 
        print (NumberToCheck) 
        end() 
       main() 

      def end(): 
       print ("end") 

      print ("start") 
      main() 

をそして私は、このエラーになっておく:

  start 
      1 
      71 
      Traceback (most recent call last): 
       File "/Users/marknorman/Documents/Problem 3.py", line 29, in <module> 
main() 
       File "/Users/marknorman/Documents/Problem 3.py", line 21, in main 
checker() 
       File "/Users/marknorman/Documents/Problem 3.py", line 15, in checker 
divider() 
       File "/Users/marknorman/Documents/Problem 3.py", line 26, in divider 
main() 

をそして、私はそれを停止しない限り、これはランダムな順序のように見えるものの中に永遠に行くだろう。

ヘルプ?

+0

これは完全なエラーではありません。私たちはすべてを見る必要があります。また、[mcve]も読んでください。実行している正確なコードを確認する必要があります。 Pythonではインデントが非常に重要なので、それを修正するのには時間がかかるでしょう。 –

+0

無限です。私はそれを数分間走らせておき、それを印刷し続けます。 –

+0

もう一つの理由は、例外を除いては、構文エラーです。 –

答えて

2

ディバイダのmain()を削除します。自然にメインに戻る代わりに、プロセスをもう一度開始するmain()メソッドを再度呼び出しているので、無限の再帰を取得しています。

サイドノートとして、これらのグローバル変数の使用をすべて停止することをお勧めします。あなたの関数からの値を代わりに返します

これはまだ関数を使用するはるかに単純なバージョンです。

def isDivisibleBy(dividend, divisor): 
    return dividend % divisor == 0 

def main(): 
    numberToCheck = 600851475143 
    i = 2 

    #infinite loop 
    while 1: 
     if isDivisibleBy(numberToCheck, i): 
      # if our number is divisible print it out and stop the loop 
      print(numberToCheck, "is divisible by", i) 
      break 
     i += 1 #increment i 

def isDivisibleBy(dividend, divisor): 
    if dividend % divisor == 0: 
     return True 
    return False 


if __name__ == "__main__": 
    main() 

はまた、機能isDivisibleByがちょうどに短絡することができることに注意してください(このような問題のためにあなたが本当にしても、とにかく機能を必要としませんが、あなたがそれらを実践しようとしているように見えます)

しかし、私は初心者のためにちょっと混乱すると思いました。

+0

ありがとう!それでおしまい。 –

+0

私は数分でグローバル変数を使用しないようにこのコードをどのようにリファクタリングするべきかに関するアップデートを投稿します – Keatinge

+0

それを楽しみにしています!グローバル変数の問題は何ですか? –

関連する問題