【问题标题】:Collatz Conjecture in PythonPython 中的 Collat​​z 猜想
【发布时间】:2017-09-30 17:48:38
【问题描述】:

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

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)

【问题讨论】:

  • print 语句无法访问 - 您预计您的程序何时到达?
  • 顺便说一句,因为您正在处理整数,所以您应该使用// 地板除法运算符而不是/,它在 Python 3 中总是返回一个浮点数。
  • 除非您将此作为递归练习,否则递归 Collat​​z 可能是个坏主意。你会用(一些)更大的数字来破坏堆栈。

标签: python math collatz


【解决方案1】:

在您的print 之前有三个returns,其中一个在else 语句中,这意味着至少其中一个将被执行,因此您的print 甚至不会被访问要执行,您应该将其移到函数定义之后以查看内容:

def collatz(n):
    print(i) # <= print here
    if n==1:
        ....

查看有关return statement 的更多信息。一个sn-p:

return 将当前函数调用与表达式列表(或None)作为返回值。

【讨论】:

    【解决方案2】:

    正如其他人所提到的,函数中的所有执行路径都以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]
    

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多