0

私はPythonの初心者ですが、奇妙な範囲外のエラーが発生しています。

アイデアは、以下を使用して初期化されたキャッシュが必要であるということです。

arr = [0]*1000000

次に、を呼び出すことによって同じ関数でアクセスします

def func (i) :
    k=1
    a = i
    arr = [0]*1000000
    while (i>1):    
        if arr[i] != 0:
            k = k + arr[i] - 1
            break
        if i%2 == 0:
            i = i/2
        else:
            i = 3*i + 1
        k += 1
    arr[a] = k
    return k

値iが1500を超えると、範囲外のエラーが発生します。ただし、キャッシュは100万intに初期化されることになっています。私は何かが足りないのですか?ありがとう

4

2 に答える 2

3

コードが投稿されたので更新しました:

1500までは問題が発生しないようです。のIndexErrorがfunc(1819)発生し、iの進化が始まります。

1819
5458
2729

で終わります

851290
425645
1276936
[...]
IndexError: list index out of range

しかし、それはバグではありません。それは単に、あなたがスペースを空けたよりも高くなるという事実です。この問題を回避するには、リストの代わりに辞書を使用できます。

-

明確にするために、これが私が念頭に置いていた種類のことです:

def func_with_dict(i) :
    k=1
    a = i
    arr = {}
    while (i>1):    
        print i
        if i in arr:
            k = k + arr[i] - 1
            break
        if i%2 == 0:
            i = i/2
        else:
            i = 3*i + 1
        k += 1
        arr[a] = k
    return k

を生成します

1819
5458
2729
8188
[...]
851290
425645
1276936
638468
319234
[...]
20
10
5
16
8
4
2

arrそして最終的な答えは162です。私は自分でこの方法を使うとは思いませんが、私何をしようとしているかは、あなたが何をしようとしているかによって異なります。

于 2012-06-08T00:43:40.800 に答える
3

この関数は、最終的に崩壊する前に任意に成長する可能性があります。

あなたはおそらく、それがしばらくの間崩壊するよりも速く成長するようにするいくつかの数を打っているだけです。渡したものより1つ多いまたは1つ少ないものを入れても、おそらく問題は発生しません。

本当に結果をキャッシュしたい場合は、Pythonのスパース配列のリストよりもdictの方が適切です。

于 2012-06-08T01:02:06.700 に答える