使用 While 循环和 If 语句在 Python 中迭代时出现奇怪的输出
Strange output while iterating in Python using While loop and If statement
我正在尝试迭代范围 (1,10)。
对于范围内的每个数字,我想应用以下逻辑。
如果数字在开始时是偶数或在后续阶段转为偶数,我想收集一个列表中的数字除以2的商。
如果数字在开始时为奇数或在后续阶段变为奇数,我想在同一个列表中收集 - 三倍数字加一 (3*X+1)。
我想对新收集的数字重复步骤 1 和 2,视情况而定,直到商为 1。
列表应以原始数字开始,以最后一个商为 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。;)
我正在尝试迭代范围 (1,10)。
对于范围内的每个数字,我想应用以下逻辑。
如果数字在开始时是偶数或在后续阶段转为偶数,我想收集一个列表中的数字除以2的商。
如果数字在开始时为奇数或在后续阶段变为奇数,我想在同一个列表中收集 - 三倍数字加一 (3*X+1)。
我想对新收集的数字重复步骤 1 和 2,视情况而定,直到商为 1。
列表应以原始数字开始,以最后一个商为 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。;)