Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Collatz猜想_Python_Math_Collatz - Fatal编程技术网

Python中的Collatz猜想

Python中的Collatz猜想,python,math,collatz,Python,Math,Collatz,我对Python比较陌生,我决定尝试编写一个相对简单的collatz猜想,其中用户输入一个数字(整数)。代码只是一个调用自身的简单函数。i是一个列表,它应该将函数计算的每个数字都附加到该列表中。我是执行Python脚本的新手,我已经尝试使用空闲shell来运行代码。它问我想要什么号码,但当我输入一个号码时,什么也不打印?我确信我只需要编辑这段代码的一小部分(或者可能这都是错误的代码),但是有人知道为什么我的脚本没有返回任何内容吗?对不起,谢谢。 代码如下: l = input("Enter a

我对Python比较陌生,我决定尝试编写一个相对简单的collatz猜想,其中用户输入一个数字(整数)。代码只是一个调用自身的简单函数。i是一个列表,它应该将函数计算的每个数字都附加到该列表中。我是执行Python脚本的新手,我已经尝试使用空闲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
之前有三个
return
s,其中一个在
else
语句中,这意味着其中至少有一个将被执行,因此您的
print
甚至不会被执行,您应该将其移动到函数定义之后以查看:

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

print(i)#在您的
print
之前有三个
return
s,其中一个在
else
语句中,这意味着至少会执行其中一个,因此您的
print
甚至不会被执行,您应该将其移动到函数定义之后以查看以下内容:

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

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

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

i.append(n)
return collatz(n)
if
else
分支中,可以将它们移到
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]

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

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

i.append(n)
return collatz(n)
if
else
分支中,可以将它们移到
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]

print
语句不可访问-您预计程序何时到达它?顺便说一句,因为您处理的是整数,所以应该使用
/
floor division运算符,而不是
/
,后者在Python 3中总是返回一个浮点。除非您将此作为递归练习来执行,递归Collatz可能是个坏主意。您将使用(一些)较大的数字来破坏堆栈。
print
语句无法访问-您预计程序何时到达它?顺便说一句,因为您处理的是整数,所以应该使用
/
楼层除法运算符,而不是
/
,在Python3中,它总是返回一个float。除非您将此作为递归的练习,否则递归Collatz可能是个坏主意。你会用(一些)更大的数字毁掉这堆东西。