Python中的Collat​​z猜想

时间:2017-09-30 17:48:38

标签: python math collatz

我对Python比较陌生,我决定尝试编写一个相对简单的collat​​z猜想,用户输入一个数字(整数)。代码只是一个调用自身的简单函数。我是一个列表,应该有函数计算的每个数字附加到它。我刚开始执行Python脚本,我尝试使用IDLE shell来运行代码。它问我想要什么号码但是当我输入一个号码时什么都没有打印出来?我确定我只需要编辑这段代码的一小部分(或者可能是错误的yikes)但是有没有人知道为什么我的脚本什么都没有返回?对此感到抱歉,谢谢。 这是代码:

l = input("Enter a number: ")
l = int(l)
i = []
def collatz(n):
    if n==1:
        return i
    if n%2 == 0:
        n = n/2
        i.append(n)
        return collatz(n)
    else:
        n = ((n*3) + 1) / 2
        i.append(n)
        return collatz(n)
    print(i)
collatz(l)

2 个答案:

答案 0 :(得分:3)

return之前有三print个,其中一个在else语句中,这意味着至少有一个会被执行,所以你的{{1}甚至无法实现,你应该在函数定义之后移动它以查看某些东西:

print

详细了解return statement。一个片段:

  

return将当前函数调用与表达式列表(或def collatz(n): print(i) # <= print here if n==1: .... )一起作为返回值。

答案 1 :(得分:0)

正如其他人所提到的,函数中的所有执行路径都以return语句结束,因此print调用无法访问。因此,如果您希望打印ni的每个值,则需要将调用移动到可以访问的某个位置。 ;)

此外,该代码还有一点冗余。你不需要

i.append(n)
return collatz(n)

ifelse分支中,您可以将它们移到if...else块之外。

这是您的代码的修改版本。我还将/运算符更改为//,以便除法的结果为整数。

i = []

def collatz(n):
    print(n)
    if n==1:
        return i
    if n%2 == 0:
        n = n // 2
    else:
        n = ((n*3) + 1) // 2
    i.append(n)
    return collatz(n)

# Test

print(collatz(12))

<强>输出

12
6
3
5
8
4
2
1
[6, 3, 5, 8, 4, 2, 1]