Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中构建返回整数直到达到1的函数_Python_While Loop - Fatal编程技术网

在Python中构建返回整数直到达到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)

我正在尝试构建一个函数,它将接受一个数字并返回一个列表。如果数字是偶数,则列表的第二个整数将是数字除以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)
        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/2
      将返回一个浮点,即使n开始时是一个整数。如果列表中只需要整数,则需要执行以下两项操作之一:
      • 使用
        n//2将其显式整除
      • 或者在将n插入列表之前,使用
        int(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
    

    请注意,您的代码没有更改
    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