2017-06-08 10 views
2

ループと変数の宣言に問題があります。現在、私はCollat​​z推測についてのプログラムを作っています。プログラムは、Collat​​z Sequenceの一定量から到達するための最大のステップが何であるかを確認する必要があります。ここに私のコード:ループとCollat​​zの予想

start_num = int(input("insert a starting Number > ")) 
how_many = int(input("how many times you want to check? >")) 


def even_or_odd(number): 
    if number % 2 == 0: 
     return 'isEven' 
    else: 
     return 'notEven' 


def collatz(n): 
    z = n 
    counter = 0 
    while True: 
     if n != 1: 
      if even_or_odd(n) == 'isEven': 
       n = n/2 
       counter += 1 
       continue 
      if even_or_odd(n) == 'notEven': 
       n = (n*3)+1 
       counter += 1 
       continue 
     else: 
      print('number ' + str(z) + ' reached 1 with : ' + str(counter) + ' steps') 
      return counter 
      break 


def check_biggest_steps(steps_before, steps_after): 
    if steps_before > steps_after: 
     return steps_before 
    if steps_after > steps_before: 
     return steps_after 
    if steps_after == steps_before: 
     return steps_after 


def compute_collatz(n_times, collatz_number): 
    for _ in range(n_times): 
     before = collatz(collatz_number) 
     collatz_number += 1 
     after = collatz(collatz_number) 
     collatz_number += 1 
     biggest_steps = check_biggest_steps(before, after) 

    print('Biggest Steps is :' + str(biggest_steps)) 


compute_collatz(how_many, start_num) 

このbiggest_steps変数は常に最後の2ステップを返します。私はこの問題の原因を知っているループの中にあるbiggest_step変数ですが、私は何をするかわからないどこでも働くことができません。ありがとう

+2

あなたの 'even_or_odd'関数はむしろ奇妙です。 'even'または' is_even'という名前をつけて、 'True'か' False'のどちらかを返すのが普通です。そうすれば、呼び出しコードは 'if is_even(n):'を実行できます。あなたがそのようにすれば、その一行 - 'if'文の必要はなく、単に' return not n%2' - だからあなたはその関数をやめ、* that *条件'collat​​z'で。同様に 'check_biggest_steps'関数全体を' max(before、after) 'に置き換えることもできます。 – lvc

答えて

1

あなた自身で試してみるまで、自分のコードを読まないでください。

すべての変更をリストに追加してから、最後に移動回数を取得するようにしてください。リストの長さを取得してください。

def collatz(x): 
    while x != 1: 
     if x % 2 > 0: 
      x =((3 * x) + 1) 
      list_.append(x) 
     else: 
      x = (x/2) 
      list_.append(x) 
    return list_ 


print('Please enter a number: ', end='') 
while True: 
    try: 
     x = int(input()) 
     list_ = [x] 
     break 
    except ValueError: 
     print('Invaid selection, try again: ', end='') 


l = collatz(x) 

print('\nList:', l, sep=' ') 
print('Number of steps required:', len(l) - 1) 
+1

ok私はあなたのコードを気にして見ています。私が目を覚ました直後に、例外処理がちょうど私の心に浮かんできました(私が目を覚ました直後にこれを書きます)。ありがとうございました ! – Wowotek

+0

問題はありません。ちょうどコードをもう一度見て、私は少しそれをきれいにしました。 – Rosh

+0

Wtf、それは恐ろしいことです - OPはシーケンスの長さだけを保持することを念頭に置いていました - メモリのログ(len(list_))のみを使用します。グローバル変数を使用すると、後であなたを蹴飛ばすことになります。 – enedil

1

あなたは最大のステップを保存せず、常に最後の2つだけを比較しました。

私は以下の変更を提案します。

def compute_collatz(n_times, collatz_number): 
    biggest_steps = 0 
    for _ in range(n_times): 
     steps = collatz(collatz_number) 
     if steps > biggest_steps: 
      biggest_steps = steps 
     collatz_number += 1 

    print('Biggest Steps is :' + str(biggest_steps)) 
+0

それは間違っているだろう。この手順では代わりにcollat​​z番号を使用します。 – Wowotek

関連する問題