python稍微修改了Collat​​z猜想程序

时间:2017-06-13 06:04:11

标签: python collatz

我被赋予了编写Collat​​z Conjecture程序的作业,修改如下:

  
      
  1. 我们知道程序总是在偶数上除以4,即使不能被4整除,所以6之后的下一步将是6/4 == 1.
  2.   
  3. 我们知道即使有替代行为,程序也总是达到停止状态,不确定代码是否有其他变化......
  4.   

它需要

  
      
  1. 计算从n到达停止条件的步数
  2.   
  3. 返回Shortz(n)中所有步骤的总和,包括n本身
  4.   

作为最终答案,我需要返回(737458374680773的所有步骤的总和)*(步骤数为98325112)

问题是当我计算这个时:737458374680773它进入无限循环。

至于这个暗示:

  

不确定代码中是否有其他更改...

我认为我不需要用奇数公式改变任何东西,因为在我看来它太过分了(但是嘿,我不太了解,启发我:)。

关于我的代码有什么问题或关于作业没有得到什么的任何想法?

这是我的代码:

import math
def shortz(num):
    iterations = 0
    stepsSum = 0
    while( math.isnan(num) or num<0):
        num = int(input("Please supply a non-negative number ==>  "))
        print("")
    while(num !=1):
         if (num%2==0):
             num /= 4 
             stepsSum += num       
             print (str(iterations+1) + ") " + str(num))
         else:
             num = (num*3) -1
             print (str(iterations+1) + ") "+ str(num))
         iterations += 1 
         stepsSum += num
    print ("the number of iterations is " + str(iterations))
    print ("the sum of all steps is " + str(stepsSum))

q=0
while (q<1):
    x = int(input("Input positive number: "))
    shortz(x)
    z = str(input("Again?")).lower()
    if z[0]=='n':
        q=2

非常感谢!

1 个答案:

答案 0 :(得分:0)

你的逻辑错误处理'2'并进入无限循环:

2/4为0.5 - > (0.5 * 3) - 1 - &gt; 0.5 - > (0.5 * 3) - 1 - &gt; 0.5等等。

Input positive number: 2
1) 0.5
2) 0.5
3) 0.5
4) 0.5
5) 0.5
6) 0.5
7) 0.5
...

您可能需要使用num //= 4代替num /= 4来摆脱小数部分。但这并不能解决这个问题,只需将重复结果从0.5更改为0。

  

不确定代码中是否有其他更改...

可能指的是如何处理零。它不是正整数,因此不是shortz()的有效输入,但它仍然作为内部结果出现(如果使用//),因此必须特别处理。 (如果继续使用/,则同样为0.5)

也许就像改变一样简单:

while(num !=1):

代替:

while num > 1:

这(以及使用//)允许您解析两个示例数字。