在Python中使用while循环和If语句迭代时输出奇怪



我正在尝试迭代范围(1,10)。

对于范围内的每个数字,我要应用以下逻辑:

  1. 如果数字在开始时是偶数或在随后的阶段变成偶数,我想在一个列表中收集该数字除以2的商。

  2. 如果数字在开始时是奇数或在随后的阶段变成奇数,我想收集-三倍的数字加一(3*X+1) -在同一个列表中。

  3. 我想重复步骤1 &对新收集到的数取2,视情况而定,直到商为1。

  4. 列表从原始数字开始,以最后一个商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。;)

相关内容

  • 没有找到相关文章

最新更新