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

Strange output while iterating in Python using While loop and If statement

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

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

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

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

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

  4. 列表应以原始数字开始,以最后一个商为 1 结束。

我写了下面的代码,它适用于所有初始值,但初始值为 3 或 6 时除外(即,当 i 为 3 或 6 时)。 3 的输出应该是 [3,10,5,16,8,4,2,1],6 的输出应该是 [6,3,10,5,16,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

这是因为您在 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()]))

好吧,这在数学领域是一个非常有趣的问题,如果您不在一个数字出现时立即终止该过程,那么无论您以任何数字开始,您都将陷入 4、2、1 的无限循环达到。

建议: 使用 -ve 数字尝试相同的过程,您会发现存在多个循环,如 4、2、1。;)