科拉兹猜想;如何编辑这段python代码,使其尝试从1到无穷大的每个数字
这是我将猜想应用于任何给定数字的代码:科拉兹猜想;如何编辑这段python代码,使其尝试从1到无穷大的每个数字,python,Python,这是我将猜想应用于任何给定数字的代码: def collataz(number): while number > 1: if number % 2 == 0 : number = number //2 print(number) elif number % 2 ==1 : number = 3 * number + 1 print(number)
def collataz(number):
while number > 1:
if number % 2 == 0 :
number = number //2
print(number)
elif number % 2 ==1 :
number = 3 * number + 1
print(number)
if number == 1 :
print("DONE!")
break
print('enter any number...!')
number=int(input())
collataz(number)
我想对它进行修改,这样一旦它运行,它就会打印出每个数字,然后再打印下一个数字。而不是要求用户输入一个数字,只需将对
collatz
函数的调用放入无限循环中即可
number = 1
while True:
collatz(number)
number += 1
可以这样解决f.e.问题:使用您填写并返回的内部列表:
def collataz(number):
def collataz(number, all_nums):
# if you ever encounter a number that does not converge to 1
# you'll get no output and will miss the chance to get famous
# this will run till 1 then return the list. But thats what it
# is about (the conjecture)
while True:
all_nums.append(number)
if number % 2 == 0 :
number = number //2
elif number % 2 ==1 :
number = 3 * number + 1
if number == 1:
all_nums.append(1)
return all_nums
rv = [] # start with empty list and
collataz(number,rv) # run the inner func
return rv # return list
print('enter any number...!')
number=int(input())
alls = collataz(number)
print(alls)
输出(678作为输入):
[67833910185091528764382191574287628643119641942197129141457743722186161616161616161616915477232 116 58,88,44,11,34,17,52,26,13,40,20,10,5,16,8,4,1]
你不可能运行所有的数字,直到无限-理由存在
:
- python中可能存在的可用数字(int,long,…)的限制给您一个猜想可能达到的“中间”数字的硬最大界
- 受你一生的限制-一定会有更多的数字需要检查,然后你体内有纳秒乘以原子
- 受个人电脑内存、能源等的限制
aVeryHighNumber = 1000000
alltimesMax = (1,[1])
for numbr in range(2,aVeryHighNumber):
alls = collataz(numbr)
print(alls)
您也可以将结果存储在字典中,但在某些情况下,您的PC资源将满
科拉茨有趣的地方在于,最长的“行”不一定是来自最高数字的那一行。尝试837799—Wig是被报道为最长低于1000000的起始值,这是最感兴趣的,因为()
>P>你可能想考虑一种记忆化来缩短计算。这里我们记录初始数字,如果数字的值低于该数字,则中断,因为我们已经看到了这些结果
然后,当打印数字时,它将返回对以前打印的系列的引用。要将其打印到无穷大,请参见@Bill the蜥蜴的答案def collataz(number):
print(number, end=': ')
initial_number = number
while True:
if number == 1 :
print("DONE!")
break
if number % 2 == 0 :
number = number //2
if number < initial_number:
print('[{}]'.format(number))
break
print(number, end=' ')
elif number % 2 ==1 :
number = 3 * number + 1
print(number, end=' ')
# form Bill the Lizard:
n = 1
while True:
collatz(n)
n += 1
你是在问如何让它不断地提示用户吗?不,我试图让它从1开始,没有用户提示,继续到2,然后是3,依此类推。这很好-也节省了很多时间。需要大量的内存,但是如果你想把它们都保存在内存中,以便“谁最长”检查。但我想你只能用startnumber作为键来存储长度信息+1不会转到infty:)只要python能够在其内部表示中计算和拟合数字,split hairs
print(sys.maxsize)=>9223372036854775807
-是否有某种mathlib(numpy?)超出该阈值?
1: DONE!
2: [1]
3: 10 5 16 8 4 [2]
4: [2]
5: 16 8 [4]
6: [3]
7: 22 11 34 17 52 26 13 40 20 10 [5]
8: [4]
9: 28 14 [7]
10: [5]
11: 34 17 52 26 13 40 20 [10]
12: [6]
13: 40 20 [10]
14: [7]
15: 46 23 70 35 106 53 160 80 40 20 [10]
16: [8]
17: 52 26 [13]
18: [9]
19: 58 29 88 44 22 [11]
20: [10]