我正在尝试迭代范围(1,10)。
对于范围内的每个数字,我要应用以下逻辑:
-
如果数字在开始时是偶数或在随后的阶段变成偶数,我想在一个列表中收集该数字除以2的商。
-
如果数字在开始时是奇数或在随后的阶段变成奇数,我想收集-三倍的数字加一(3*X+1) -在同一个列表中。
-
我想重复步骤1 &对新收集到的数取2,视情况而定,直到商为1。
-
列表从原始数字开始,以最后一个商1结束。
我已经写了下面的代码,它是工作良好的所有初始值,除了当初始值为3或6(即。3的输出应该是[3,10,5,16,8,4,2,1],而6的输出应该是[6,3,10,5,16,8,8,4,2,1]。相反,我分别得到[3,1]和[6,3,1]。为什么会这样?如有任何意见,我们将不胜感激。
d ={}
for i in range(1,10):
x=i
l=[x]
while (x // 2) != 1:
if (x%2) == 0:
l.append(x//2)
x=x//2
else:
l.append(x*3+1)
x=x*3+1
l.append(x//2)
d[i] = l
pd.DataFrame(dict([(k,pd.Series(v)) for k,v in d.items()]))
1 2 3 4 5 6 7 8 9
0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9
1 4.0 1.0 1.0 2.0 16.0 3.0 22.0 4.0 28
2 2.0 NaN NaN 1.0 8.0 1.0 11.0 2.0 14
3 1.0 NaN NaN NaN 4.0 NaN 34.0 1.0 7
4 NaN NaN NaN NaN 2.0 NaN 17.0 NaN 22
5 NaN NaN NaN NaN 1.0 NaN 52.0 NaN 11
6 NaN NaN NaN NaN NaN NaN 26.0 NaN 34
7 NaN NaN NaN NaN NaN NaN 13.0 NaN 17
8 NaN NaN NaN NaN NaN NaN 40.0 NaN 52
9 NaN NaN NaN NaN NaN NaN 20.0 NaN 26
10 NaN NaN NaN NaN NaN NaN 10.0 NaN 13
11 NaN NaN NaN NaN NaN NaN 5.0 NaN 40
12 NaN NaN NaN NaN NaN NaN 16.0 NaN 20
13 NaN NaN NaN NaN NaN NaN 8.0 NaN 10
14 NaN NaN NaN NaN NaN NaN 4.0 NaN 5
15 NaN NaN NaN NaN NaN NaN 2.0 NaN 16
16 NaN NaN NaN NaN NaN NaN 1.0 NaN 8
17 NaN NaN NaN NaN NaN NaN NaN NaN 4
18 NaN NaN NaN NaN NaN NaN NaN NaN 2
19 NaN NaN NaN NaN NaN NaN NaN NaN 1
这是因为你使用的是//而不是/in while循环的条件我们知道3//2等于1因此while循环中的代码永远不会被执行你可以试试这个
d ={}
for i in range(1,10):
x=i
l=[x]
while (((x / 2) != 1) and (x != 1)):
if (x%2) == 0:
l.append(x//2)
x=x//2
else:
x=x*3+1
l.append(x)
l.append(x//2)
d[i] = l
pd.DataFrame(dict([(k,pd.Series(v)) for k,v in d.items()]))
在数学领域这是一个很有趣的问题无论你从哪一个数开始如果你没有在到达1时立即终止这个过程你最终都会进入一个4,2,1的无限循环
建议:尝试使用- 5个数字进行相同的处理,您会注意到存在多个循环,如4,2,1。;)