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