2016-10-08 9 views
1

3行目にエラーが表示されます。 "TypeError: 'int'オブジェクトが反復可能ではありません。アドバイス/修正がありがとうございました。シーケンス関数のエラー?

例試験:collat​​z_counts(4)→3#4 - > 2 - 私は> 1(3段階)

コード:

def collatz_counts(x): 
    num = 0  
    for i in (x): 
     if i == 1: 
      num += 1 
      return num 
     elif i % 2 == 0: 
      num(i)/2 
      num += 1 
      num.append(i) 
     else: 
      num = (i*2) + 3 
      num += 1 
      num.append(i)  
    return num 
+0

関数は何を返す必要がありますか?単一の整数?なぜあなたは 'num.append'を使っていますか? –

+0

申し訳ありませんが、Pythonを学んでいます。私はif文の計算の後で整数をリストに戻そうとしていました。はい、単一の整数を返す必要があります。 –

答えて

0

は、whileループを使用します。 1になるまでxを変更し、サイクルを実行するたびにstepsの数を記録してください。

def collatz_counts(x): 
    steps = 0 
    while x != 1: 
     if x % 2: 
      x = x * 3 + 1 
     else: 
      x = x // 2 
     steps += 1 
    return steps 
+0

説明してくれてありがとうございます。初期値xをステップとして数えると、デフォルトのステップ= 1にするだけですか? –

2

これは再帰的に解決することができます:

あなたは、例えば、数値の範囲を求めることとしている場合はメモ化するために自分自身を貸す
def collatz_length(n): 
    if n == 1: 
     return 1 
    return 1 + collatz_length(3*n+1 if n%2 else n//2) 

反復解法約2.31s対について28.6sに最初の100万のcollat​​zの配列を介して実行されますPY3

import functools as ft 

@ft.lru_cache(maxsize=None) 
def collatz_length(n): 
    if n == 1: 
     return 1 
    return 1 + collatz_length(3*n+1 if n%2 else n//2) 

関連する問題