2012-07-03 35 views
1

这里是我的代码:为什么我得到一个内存错误?

i=int(input("enter your number")) 
j=int(input("enter your number")) 
if i>j: #making x always greater than y 
    x=i 
    y=j 
elif i<j: 
    x=j 
    y=i 
else: 
    print("invalid") 
k=y 
cyclelength=[] 
while k<=x: 
    list=[k] 
    while k!=1: 
     if(k%2==0): 
      k=i//2 
     else: 
      k=3*k+1 
     list.append(k) 
    cyclelength.append(len(list)) 
    k+=1 
print(y," ",x," ",max(cyclelength)) 

我得到以下异常:

Traceback (most recent call last): 
    File "C:/Python32/uva100.py", line 21, in <module> 
    list.append(k) 
MemoryError 
+0

你想在这里做什么? –

+5

'k'永远不会是'1',所有追加内存空间不足。 –

+4

作为一个可读性的一般注释,你应该使用比简单字母更有意义的变量名称(除非处理非常简单和短的算法,或者像在for-loop中使用'i'作为循环变量的一些约定)。它将使未来更容易维护您的代码。 –

回答

2

在此块的另一个问题:

while k!=1: 
    if(k%2==0): 
     k //= 2 
    else: 
     k=3*k+1 

k的值1,当你退出。

所以你增量k以2,重新进入而因为ķ< x和复位k以1

- >无限循环

你在你定义一个新的变量内的同时或提取此阻止另一个功能

5

你可能意味着代替k //= 2k=i//2

def cyclelength(k): 
    assert k > 0 
    count = 1 
    while k != 1: 
     k = k // 2 if k % 2 == 0 else 3 * k + 1 
     count += 1 
    return count 

k_with_max_cyclelength = max(range(y, x+1), key=cyclelength) 

或获得两个:

k, max_cyclelength = max(((k, cyclelength(k)) for k in range(y, x+1)), 
         key=lambda pair: pair[1]) 
+0

+1内添加导入sys; print k; sys.stdout.flush() ,因为这似乎实现了OP预期的算法,也非常易于读取。该算法实际上并不起作用(例如,如果你给它0或负数,对于较低值,显然它永远不会变成正值......),但那不是你的错。 – abarnert

+0

@abarnert:我已经添加了断言,但无效的'y'应该早些时候丢弃。 – jfs

+0

关键是,它只是一个未经证实的猜想,即3x + 1迭代收敛于所有正x,因此,除非你能证明猜想(或解决暂停问题,当然你不能),否则无法为OP的算法提供了一个成功的实现。我只是提出了负数,因为这些数字相当明显,因此突出了问题。再一次,你的实现是OP的意图,并不是你的错,它实际上并不工作。 – abarnert

0

我想你会为

n=y 
cyclelength=[] 
while n<=x: 
    k=n 
    list=[k] 
    while k!=1: 
     if(k%2==0): 
      k//=2 
     else: 
      k=3*k+1 
     list.append(k) 
    cyclelength.append(len(list)) 
    n+=1 
0

这就像你正在与Collatz conjecture玩。尝试

def get_int(prompt): 
    while True: 
     try: 
      return int(raw_input(prompt)) 
     except ValueError: 
      pass 

def sequence_length(k): 
    length = 0 
    while k > 1: 
     k = 3*k+1 if k&1 else k//2 
     length += 1 
    return length 

def max_sequence_length(lo, hi): 
    best_k, best_length = None, 0 
    for k in xrange(lo, hi+1): 
     length = sequence_length(k) 
     if length > best_length: 
      best_k, best_length = k, length 
    return best_k, best_length 

def main(): 
    lo = get_int("Enter the start number: ") 
    hi = get_int("Enter the finish number: ") 
    lo, hi = min(lo, hi), max(lo, hi) 
    best_k, best_length = max_sequence_length(lo, hi) 
    print("In {}..{}, max cycle length is {} at k = {}".format(lo, hi, best_length, best_k)) 

if __name__=="__main__": 
    main()