2017-12-30 26 views
1

注:while文が整数であるときにwhile文がFalseに評価されなかった理由を理解しようとしていたので、これは重複とは思われません条件が満たされてもループが中断しない(Collat​​z Sequence)

プログラムが入力を受け取り、次のアルゴリズムを使用して入力を1に減らす、Pythonで退屈なものの行使を自動化しています。代わりに、whileループの破壊の

#even/2 
#odd * 3 + 1 


def collatz(): 
    print("Enter number:") 
    number = input() 
    try: 
     data = int(number) # Input Validation 

     while int(data) != 1: 
      if data % 2 == 0: #Number is even 
       data = int(data/2) 
       print(data) 
      if data % 2 == 1: # Number is odd 
       data = int(3*data+1) 
       print(data) 

    except: 
     print("Please input a valid value") 
     collatz() 

collatz() 

数が1に減少される場合、ループは継続し、それが3で1を乗算し(普通奇数として)1を加算します。私は浮動小数点を返すかもしれないと思ったので、多くのint変換が行われました。

したがって、不要なint型の変換はどこにあるのか、while文を使用してそれを中断する方法を教えてください。コードのクリーンアップはあなたが適切とちょうど一般的に、より良いあなたのコードを動作させるためにアップneatenすべきいくつかのことがあります

答えて

2

高く評価され:

  • 名前の変更datanに、これは多くを作るつもりはありません違いはありますが、もっと理にかなっていると思います。
  • intに無限の変換を行う必要はありませんが、nしか一度integerstringから変換する必要があります。
  • コード全体をfunctionに入れないでください。メインアルゴリズムをfunctionにしてコードの本体から呼び出したり、別のfunctionを作成してアルゴリズムを呼び出すこともできます物事の入力側。
  • 数がでもになるため、あなたは小数点が0になることを確認することができ、代わりに浮動小数点除算器(/)の整数の除算演算子(//)を使用します。
  • あなたはそれn % 2はあなただけif ... else句を使用することができ、1ある場合n % 2は、次の行のチェックに続い0であるとかどうかをチェックする必要はありません。

それはそれです!

#even/2 
#odd * 3 + 1 

def collatz(n): 
    while n != 1: 
     if n % 2 == 0: #Number is even 
      n = n // 2 
     else: 
      n = n * 3 + 1 
     print(n) 

number = input("Enter number:") 

try: 
    number = int(number) 
    collatz(number) 
except ValueError: 
    print("Please input a valid value") 

そしてテストが、それは(24の入力)に動作を示しています:ここでは次のようになります

12 
6 
3 
10 
5 
16 
8 
4 
2 
1 
+0

はすべてのヒントや改善をありがとう! 1つの関数にすべてのコードを残していたのですが、nの場合や私のケースのデータが1のときにwhileループが壊れないのはなぜですか? –

+0

@KOOTSHOOTSは見つかりました! 2つの 'if'文を実行しているので、' data'が '2'の場合、最初のテストに合格し、' 2'で割り、 '1'を割ります。それが今や奇妙であったことを見て、それに「3」を乗じて「1」を加えることによってそれを維持してください。だから私の関数が動作しているのは、私が 'else'を使ったからです。 **:)**その時受け入れてください! –

関連する問題