【问题标题】:Using while loops and variables使用 while 循环和变量
【发布时间】:2016-09-29 22:29:57
【问题描述】:

我正在尝试从“使用 Python 自动化无聊的东西”一书中编写一个 collat​​z 程序,但遇到了一些问题。我正在使用 python 3.5.2。这是项目大纲:

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

我的代码:

def collatz(number):
    if number % 2 == 0:     #its even
        print(number // 2)
        return number // 2
    elif number % 2 == 1:   #its odd
        print(3*number+1)
        return 3*number+1


print('Type an integer: ')
num=int(input())

while(True):
   if collatz(num) == 1:
        break

 # Or even simpler:
 # while(collatz(num) != 1):
 #       pass

输出给了我一个无限循环:

Type an integer: 
10
5
5
5
5
5
5
5
5
...

但是当我分解它并使用一个变量来存储返回值时,它就起作用了:

 while(True):
    num=collatz(num)
    if num == 1:
        break

输出:

Type an integer: 
5
16
8
4
2
1

为什么会这样?我不明白为什么第一个程序不起作用。两者相似,但我只是选择直接在原始程序中测试返回值,而不是使用变量。 我会很感激任何帮助,谢谢。

【问题讨论】:

  • 你的无限循环版本永远不会更新num的值。
  • 好吧,这对我来说是一个非常愚蠢的错误。好吧,它发生了......谢谢伙计。

标签: python variables while-loop


【解决方案1】:

您的代码:

while(True):
    if collatz(num) == 1:
        break

不起作用,因为每次调用collatz 时,都会使用相同的 num 值调用它,结果一次又一次地返回相同的数字。这个数字不是 1,所以你有一个无限循环。

当您执行num = collatz(num) 时,num 的值会在第一次调用该函数时更改。然后将新值传递给第二次调用该函数,依此类推。所以最终你会到达num的值变为1并退出循环的点。

【讨论】:

  • 请考虑不要回答归结为拼写错误的问题和can be answered in a comment。这些问题对未来的读者没有帮助,但提供完整的答案可能会阻碍自动删除过程,并且从长远来看会使 Stack Overflow 变得混乱。
  • @AndrasDeak 我不知道我们如何在这里定义错字级别的问题。你能给我一些指导吗?据我所知,OP 在理解他的代码逻辑方面存在问题。对于有经验的程序员来说,这是微不足道的,但对于初学者来说可能就不一样了。他犯的错误不是拼写错误,而是代码中的错误。
  • 你说得对,我倾向于认为错别字与有一百个重复的非常基本的错误属于同一类别:) 以下是与类似错别字的问题相对应的密切原因的文本:“这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。虽然类似的问题可能是这里的主题,但这个问题的解决方式不太可能帮助未来的读者。[...]”。我的意思是本着第二句话的精神发表评论。我相信你的答案很好,你可以保留它。只是想在以后考虑这方面:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2014-02-07
相关资源
最近更新 更多