在Python中构建返回整数直到达到1的函数
我正在尝试构建一个函数,它将接受一个数字并返回一个列表。如果数字是偶数,则列表的第二个整数将是数字除以2。若它是奇数,那个么接下来的数字将是数字乘以3加1,依此类推,直到它达到1。 例如:在Python中构建返回整数直到达到1的函数,python,while-loop,Python,While Loop,我正在尝试构建一个函数,它将接受一个数字并返回一个列表。如果数字是偶数,则列表的第二个整数将是数字除以2。若它是奇数,那个么接下来的数字将是数字乘以3加1,依此类推,直到它达到1。 例如: Function(5) will give [5, 16, 8, 4, 2, 1] My code is: def Collatz(n): out=[] while n>1: if n%2==0: out.append(n/2)
Function(5) will give
[5, 16, 8, 4, 2, 1]
My code is:
def Collatz(n):
out=[]
while n>1:
if n%2==0:
out.append(n/2)
elif n%2!=0:
out.append((n*3)+1)
print(out)
Collatz(20)
它什么也不生产。有什么建议吗?我想对while循环执行此操作。这是因为while循环从未终止,这是因为实际上每次都没有更改n的值。所以,在你附加到数组之前,先说n=n/2(或者不管计算是什么),然后再附加n。这意味着n最终将达到1,您将得到一份打印输出此代码即将运行,有一些见解和改进:
循环时在内更改n
(否则n
保持大于1
并获得无限循环)
代码的问题在于没有递减
n
的值,这会导致无限循环。
每次在列表中添加新值时,还需要更新n的值
试试这个:
def Collatz(n):
out=[]
while n>1:
if n%2==0:
out.append(n//2)
#updating n
n= n//2
elif n%2!=0:
out.append((n*3)+1)
#updating n
n= (n*3)+1
print(out)
Collatz(20)
def Collatz(n):
l=[n]
while l[-1]!=1:
x=l[-1]/2 if l[-1]%2==0 else l[-1]*3+1
l.append(int(x))
return l
输出:
[10,5,16,8,4,2,1]这是一个有效的版本
def Collatz(n):
out=[n]
while n>1:
if n%2==0:
n = n/2
else:
n = (n*3)+1
out.append(int(n))
return out
print(Collatz(5))
关于您的版本的一些注意事项:
- 你的循环永远不会更新“n”,所以n永远停留在它的初始值,让你处于一个无限循环中
- “elif”可以是简单的“else”-如果值不是偶数,那么它是奇数(假设我们使用的是整数)
- 如果您希望初始值在列表中,我们可能应该以这种方式初始化列表
- 在问题陈述中,您说您需要函数“返回列表”。如果您真的只需要从函数内部打印就可以了,但是如果我们使用
语句返回列表,那么它生成的列表可以被其他代码使用return
- 如果您使用的是Python3,那么操作
将返回一个浮点,即使n开始时是一个整数。如果列表中只需要整数,则需要执行以下两项操作之一:n/2
- 使用
n//2将其显式整除
- 或者在将n插入列表之前,使用
将n重新转换为整数。(我就是这样做的。)int(n)
- 使用
def Collatz(n):
out=[]
while n>1:
if n%2==0:
out.append(n//2)
#updating n
n= n//2
elif n%2!=0:
out.append((n*3)+1)
#updating n
n= (n*3)+1
print(out)
Collatz(20)
def Collatz(n):
l=[n]
while l[-1]!=1:
x=l[-1]/2 if l[-1]%2==0 else l[-1]*3+1
l.append(int(x))
return l
请注意,您的代码没有更改
n
。因此,您的循环永远不会终止。看看这个:
def collatz(n):
my_list = [n]
while n > 1:
if n % 2:
n = n * 3 + 1
else:
n = n / 2
my_list.append(n)
return(my_list)
如果要退出while循环,必须在while
循环中实际更改n
。分配n=n/2
和n=n*3+1
,然后将n
的新值附加到out
。