我被赋予了编写Collatz Conjecture程序的作业,修改如下:
- 我们知道程序总是在偶数上除以4,即使不能被4整除,所以6之后的下一步将是6/4 == 1.
- 我们知道即使有替代行为,程序也总是达到停止状态,不确定代码是否有其他变化......
醇>
它需要
- 计算从n到达停止条件的步数
- 返回Shortz(n)中所有步骤的总和,包括n本身
醇>
作为最终答案,我需要返回(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
非常感谢!
答案 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:
这(以及使用//
)允许您解析两个示例数字。