【问题标题】:Collatz sequence (endless loop)Collat​​z 序列(无限循环)
【发布时间】:2019-08-27 08:58:45
【问题描述】:

首先我知道这是一个非常问的问题。编写一个名为 collat​​z() 的函数,它有一个名为 number 的参数。如果 number 是偶数,那么 collat​​z() 应该打印 number // 2 并返回这个值。 如果 number 是奇数,则 collat​​z() 应该打印并返回 3 * number + 1。 然后编写一个程序,让用户输入一个整数并保持 在该数字上调用 collat​​z() 直到函数返回值 1。

def collatz(number):

  return [number //2 if number %2 == 0 else 3*number + 1]


number = int(input('Number - \n'))

while number != 1:

  result = collatz(number)
  print(result)

我在我的程序中不明白为什么它会执行第一个操作并卡在第一个数字中。就像我输入 12 它返回 6 但由于永远打印 6 而卡在 while 循环中。我想了解这个程序具体出了什么问题。

【问题讨论】:

  • 你永远不会更新number,所以什么都不会改变。还有,为什么要在collatz返回一个列表?
  • 我认为这是编写 if else 序列@ThierryLathuille 的一种更紧凑的方式
  • 只需删除 [ ],它会构建一个包含您的结果的列表。

标签: python recursion


【解决方案1】:

您的问题是您正在丢弃result。您的意思可能是number = collatz(number)[0](出于某种原因,您在这里使用了一个列表)。

由于您没有在循环中修改number,因此条件的计算结果始终相同,collatz 的输入始终相同。

【讨论】:

    【解决方案2】:

    问题在于您没有将新元素附加到列表中,而是将列表替换为当前结果。 我已经修改了您的代码,以便列表中填充了序列中的元素:

    n = int(input("n="))
    l = []
    while n != 1:
      l.append(n);
      n = n // 2 if n % 2 == 0 else n * 3 + 1
    print(l)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2013-03-07
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多