2016-09-29 83 views
0

我想从'自动化枯燥的东西与Python书',但已遇到一些问题编写collat​​z程序。我正在使用python 3.5.2。以下是项目大纲:使用while循环和变量

编写一个名为collat​​z()的函数,该函数有一个名为number的参数。如果数字是偶数,那么collat​​z()应该打印数字// 2并返回该值。如果数字是奇数,那么collat​​z()应该打印并返回3 *数字+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 

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

+6

你的无限循环版本永远不会更新'num'的值。 – Blorgbeard

+1

那么这是我的一个非常愚蠢的错误。好吧,它发生..谢谢你。 – tadm123

回答

2

您的代码:

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

没有工作,因为每次collatz被调用时,被称为与NUM的值相同,因此一次又一次地返回相同的号码。这个数字不是1,所以你有一个无限循环。

当你做num = collatz(num)时,num的值在第一次调用该函数时被改变。然后将新值传递给函数第二次调用,等等。所以最终当num的值变为1并退出循环时达到一个点。

+0

请考虑不回答问题,归结为错字级问题和[可在评论中回答](http://stackoverflow.com/questions/39780993/using-while-loops-and-variables#comment66856127_39780993)。这些问题对未来的读者没有任何帮助,但提供完整的答案可能会阻碍自动删除过程,并长期影响Stack Overflow。 –

+0

@AndrasDeak我不知道我们如何在这里定义错字级问题。你能指点我一些指导方针吗? 从我看到OP有问题了解他的代码的逻辑。对于有经验的程序员来说,这是微不足道的,但对于初学者来说可能并不一样。他犯的错误不是拼写错误,而是代码中的错误。 – xuanluong

+1

你是对的,我倾向于认为错别字与具有一百重复的非常基本的错误属于同一类别:)下面是来自与错字类问题相对应的紧密原因的文本:“*这个问题是由一个问题引起的不再被复制或者是一个简单的印刷错误,虽然类似的问题可能会在这里讨论,但这个问题的解决方式不可能对未来的读者有所帮助[...] *“。我的意思是第二句话的精神。我相信你的答案是好的,你可以保留它。只是想在未来考虑这方面:) –