用Python实现冰雹猜想(3n+1猜想,角谷猜想,叙古拉猜想)的黑洞演示

目录

一、冰雹猜想的来由

二、实现方法

1、定义根据规则生成新数的函数

2、定义生成列表的函数

3、定义主函数

三、完整代码

四、部分代码分析

五、输出结果

1、输入4

2、强悍的27

总结:


前面完成两个黑洞的程序演示,下面用python实现冰雹猜想的演示,如果对前面的两个黑洞的程序演示有想法,可以参考我以前的两篇博文。

一、冰雹猜想的来由

1976年的一天,《华盛顿邮报》于头版头条报道了一条数学新闻。文中记叙了这样一个故事:

70年代中期,美国各所名牌大学校园内,人们都像发疯一般,夜以继日,废寝忘食地玩弄一种数学游戏。这个游戏十分简单:任意写出一个正整数N,并且按照以下的规律进行变换:

如果是个奇数,则下一步变成3N+1。

如果是个偶数,则下一步变成N/2。

不单单是学生,甚至连教师、研究员、教授与学究都纷纷加入 。为什么这种游戏的魅力经久不衰?因为人们发现,无论N是怎样一个数字,最终都无法逃脱回到谷底1。准确地说,是无法逃出落入底部的4-2-1循环,永远也逃不出这样的宿命。

这就是著名的“冰雹猜想”

冰雹猜想又称角谷猜想,因为是一个名叫角谷的日本人把它传到中国。

二、实现方法

1、定义根据规则生成新数的函数

#生成新数
def generate_new_number(number):
    if number % 2 == 0:
        number = number / 2
    else:
        number = number * 3 + 1
    return int(number) 

输入正整数,根据奇偶性进行相应的运算,并返回新数

2、定义生成列表的函数

#定义计算生成列表的函数
def cal_to_list(input_number):
    number_list =[]     #用于存放过程中的数值
    new_number = generate_new_number(input_number)
    number_list.extend([input_number,new_number])
    #符合条件循环,并将产生的数存入列表,以便查阅统计
    while new_number > 1:
        new_number = generate_new_number(new_number)
        number_list.append(new_number)
    #打印输出
    for item in number_list:
        print(item)
    #打印输出特殊值
    print("进行了{0}次运算".format(len(number_list)-1))
    print("最大的数是{0}".format(max(number_list)))

调用前面的新数产生函数,产生新数,并根据情况跳出循环,将结果存放到列表中。

3、定义主函数

def main():
    input_number = input("请输入一个正整数!")  # 接收输入的数
    input_int_number = int(input_number)  
    cal_to_list(input_int_number)

    str_begin = input("再来一次,y 或 n ?")
    if str_begin  in ['Y','y','是']:
        main()
    elif str_begin == 'N' or str_begin == 'n':
        print("感谢您的使用!")
    else:
        print("输入错误,会重新开始!")
        main()

包括接收输入数据,调用函数,决定是否再次运行主程序

三、完整代码

"""本程序用来演示冰雹猜想
基本描述:
冰雹猜想 是指:一个正整数x,如果是奇数就乘以3再加1,
如果是偶数就析出偶数因数2ⁿ,这样经过若干个次数,最终回到1。
实现方法:
利用函数判断生成新的数据,调用函数运算不断运算直到符合最小正整数的条件
备注:
以后学习数据分析时,可以生成数据,统计每个正整数的数据情况
"""
#生成新数
def generate_new_number(number):
    if number % 2 == 0:
        number = number / 2
    else:
        number = number * 3 + 1
    return int(number)   #如果此处不加int转化,则会产生的浮点数,没找到为什么.

#定义主函数
def main():
    input_number = input("请输入一个正整数!")  # 接收输入的数
    input_int_number = int(input_number)  # 由于输入的数据直接生成的是字符类的数据,必须先转化为
    cal_to_list(input_int_number)

    str_begin = input("再来一次,y 或 n ?")
    if str_begin  in ['Y','y','是']:
        main()
    elif str_begin == 'N' or str_begin == 'n':
        print("感谢您的使用!")
    else:
        print("输入错误,会重新开始!")
        main()
#定义计算生成列表的函数
def cal_to_list(input_number):
    number_list =[]     #用于存放过程中的数值
    new_number = generate_new_number(input_number)
    number_list.extend([input_number,new_number])
    #符合条件循环,并将产生的数存入列表,以便查阅统计
    while new_number > 1:
        new_number = generate_new_number(new_number)
        number_list.append(new_number)
    #打印输出
    for item in number_list:
        print(item)
    #打印输出特殊值
    print("进行了{0}次运算".format(len(number_list)-1))
    print("最大的数是{0}".format(max(number_list)))

main()

四、部分代码分析

1、input()输入的数据字符串类型。

通过input输入的数据是字符串类型,要进行数学运算必须先转化为整数型,否则后面的列表比较求最大值时会产生错误。

 input_number = input("请输入一个正整数!")  # 接收输入的数
 input_int_number = int(input_number) 

2、列表多个元素的添加

列表添加多个列表元素时,

一种方法是利用append(),但是每次只能添加一个元素,两个元素需要分两次添加。

第二种方法是利用extend(),但是需要将多个元素组合成列表加入

#方法一,利用append()逐个加入
    number_list.append(input_number)
    number_list.append(new_number)
#方法二,利用extend(),组合成列表后加入,内存操作相对较多
    number_list.extend([input_number,new_number])

五、输出结果

1、输入4

请输入一个正整数!4
4
2
1
进行了2次运算
最大的数是4

2、强悍的27

请输入一个正整数!27
27
82
......
9232
4616
2308
......
2
1
进行了111次运算
最大的数是9232

备注:冰雹的最大魅力在于不可预知性。英国剑桥大学教授John Conway找到了一个自然数27。虽然27是一个貌不惊人的自然数,但是如果按照上述方法进行运算,则它的上浮下沉异常剧烈:首先,27要经过77步骤的变换到达顶峰值9232,然后又经过34步骤到达谷底值1。全部的变换过程(称作“雹程”)需要111步,其顶峰值9232,达到了原有数字27的342倍多,如果以瀑布般的直线下落(2的N次方)来比较,则具有同样雹程的数字N要达到2的111次方。其对比何其惊人!

总结:

总体来说,程序实现起来比较简单,但对于结果的分析还是做的不到位的,需要进行分析,有可能的话可以进行数学的推导与验算。再次学习了数据分析以后,可以将每个数的值进行分析,总结规律。

猜你喜欢

转载自blog.csdn.net/sygoodman/article/details/124683507