在python 3中,如何将input()函数放入def函数中
我正在处理我在一本书中找到的collatz序列,我想输入数字,但它不起作用,当我输入数字时,回车键不起作用,我的程序有什么错误吗在python 3中,如何将input()函数放入def函数中,python,python-3.x,function,input,Python,Python 3.x,Function,Input,我正在处理我在一本书中找到的collatz序列,我想输入数字,但它不起作用,当我输入数字时,回车键不起作用,我的程序有什么错误吗 even = range(0,10**5,2) odd = range(1,10**5,2) def collatz_s(num): while num !=1 : if num in even : result = num /2 print(result) num =
even = range(0,10**5,2)
odd = range(1,10**5,2)
def collatz_s(num):
while num !=1 :
if num in even :
result = num /2
print(result)
num = result
elif num is odd :
result = num *3+1
num = result
print(result)
num = int(input('choose a random number'))
collatz_s(num)
问题在
elif
块中,这里elif num是奇数:
changeis
toin
处理余数时,使用整数除法(//)
来避免精度
错误
def collatz_s(num):
while num != 1:
if num in even:
result = num // 2
print(result)
num = result
elif num in odd:
result = num * 3 + 1
print(result)
num = result
num = int(input('choose a random number'))
collatz_s(num)
# input 5
# output
16
8
4
2
1
要检查一个数字是奇数还是偶数,而不是生成
range
对象并检查这些对象中的一个数字是否为,请查看除以2的余数,可以使用num%2
获得。如果剩余值为1,则表示该数字为偶数。否则,这很奇怪
另外,使用num//2
执行整数除法。用16除以2会得到8(整数),而不是8.0(浮点数)。事实证明,这在这里非常重要,特别是因为你对求除法的余数感兴趣(这个概念主要涉及整数)
我相信浮点除法中的舍入错误很可能会使程序进入无限循环(因为小数点很小的数字既不在偶数范围内,也不在奇数范围内),或者超过了范围的限制(105)您将处于两个分支都不匹配的相同情况。使用整数除法和使用余数检查偶数或奇数应该可以解决这两个问题
def collatz_s(num):
while num != 1:
if num % 2 == 0:
num = num // 2
print(num)
else:
num = num * 3 + 1
print(num)
是的,它现在正在工作,但该程序不支持大数字。它将支持大数字,但需要很长时间。想一个有效的方法。@Tasnuva如果你在奇数中引用,在偶数中引用,
它已经是常数时间了,范围对象具有常数时间成员身份checking@YassineRemmal那是因为你对你的偶数和奇数使用固定的数量。这不是检查某物是否为偶数或奇数的正常方法,您应该使用编号%2
@Tasnuva否,它不是迭代,它不是列表
对象它是范围
对象,它为int
objects实现了常量时间成员身份测试。您所说的范围在Python 3中绝对不正确。我可以在范围(0,10**20,2)内执行5*10**19操作,并立即得到答案-不可能迭代那么多值。(在Python2中,您所说的是正确的,但问题明确地说是Python3。)也就是说,显然我同意您的测试更好,因为OP对范围的使用对数字必须落下的范围施加了任意限制(或者它既不是偶数也不是奇数)。但是你关于费用的陈述应该被删除。@alani是的,你是对的,有一个特殊的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我会更新我的答案。@filbranden没有列表<代码>范围
对象具有int对象的恒定时间成员身份测试。它们也是恒定的空间,但你的总体建议是好的。这种方法确实在大量使用中。谢谢。请澄清问题。你认为问题出在哪里?你是怎么对付那个问题的?