Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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代码,使其尝试从1到无穷大的每个数字_Python - Fatal编程技术网

科拉兹猜想;如何编辑这段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]