Collatz猜想;我如何编辑这个python代码,使它尝试从1到无穷大的每一个数字

2021-10-17 14:39:55 发布

您现在位置: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)

        if number == 1 :
            print("DONE!")
            break


print('enter any number...!')
number=int(input())
collataz(number)

我想修改它,这样一旦它运行,它就会打印每个数字,然后再打印下一个数字。你知道吗

3条回答
网友
1楼 ·

可以这样解决:使用您填写的内部列表并返回它:

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作为输入):

[678, 339, 1018, 509, 1528, 764, 382, 191, 574, 287, 862, 431, 1294, 647, 1942, 971, 2914, 1457, 4372, 2186, 1093, 3280, 1640, 820, 410, 205, 616, 308, 154, 77, 232, 116, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

在无限理性存在之前,你不可能运行它 地址:

  • python中可能存在的可用数字(int,long,…)的限制给您一个猜想可能达到的“中间”数字的硬最大界
  • 受你一生的限制-一定会有更多的数字需要检查然后你体内有纳秒乘以原子
  • 你的电脑内存、能量等的限制

您可以尝试许多数字:

aVeryHighNumber = 1000000
alltimesMax = (1,[1])
for numbr in range(2,aVeryHighNumber):
    alls = collataz(numbr) 
    print(alls)

你也可以把结果储存在字典里,但有时你的电脑资源会满的。你知道吗

科拉兹有趣的一点是,最长的“行”不一定是数字最高的那一行。Try 837799-据报道,它最长的起始值低于1000000,这主要是因为(https://projecteuler.net/problem=14

网友
2楼 ·

您只需将对collatz函数的调用放入一个无限循环,而不是要求用户输入一个数字。你知道吗

number = 1
while True:
    collatz(number)
    number += 1
网友
3楼 ·

您可能需要考虑一种回忆录来缩短计算时间。这里我们记录初始数字,如果数字的值低于该数字,则中断,因为我们已经看到了这些结果。你知道吗

当数字被打印出来时,它将返回一个对先前打印的序列的引用。要将其打印到无穷远,请参阅@Bill the Lizard's answer。你知道吗

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

这是前20行。你知道吗

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]

相关问题