• Python
  • Python 实现角谷猜想(冰雹猜想)教程

  • @ 2025-5-17 20:25:53

Python 实现角谷猜想(冰雹猜想)教程

什么是角谷猜想(Hailstone Conjecture)?

角谷猜想(又称冰雹猜想、Collatz 猜想) 是一个著名的数学未解难题之一,由德国数学家 Lothar Collatz 在1937年提出。

📌 猜想规则:

对于任意一个正整数 n

  • 如果 n偶数,就将其除以 2:n = n // 2
  • 如果 n奇数,就将其乘以 3 并加 1:n = 3 * n + 1
  • 不断重复上述过程,最终总会得到 1

⚠️ 目前这个猜想尚未被证明,但已验证对所有小于非常大数值的正整数都成立。


💡 示例演示

我们以 n = 6 为例:

6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

总共经过了 8 步,最终到达 1。


✅ 教学目标

本教程将教你如何用 Python 编写一个程序来模拟角谷猜想的过程,并输出每一步的结果。


🔧 编程实现步骤

第一步:获取用户输入

我们可以让用户输入一个正整数:

n = int(input("请输入一个正整数:"))

第二步:检查输入是否合法

确保输入是大于 0 的正整数:

if n <= 0:
    print("请输入一个大于0的正整数!")
else:
    # 执行角谷猜想逻辑

第三步:执行角谷猜想过程

使用一个 while 循环不断进行变换,直到 n == 1

steps = 0  # 记录步数
print(f"开始计算角谷猜想序列(初始值为 {n}):")
print(n)

while n != 1:
    if n % 2 == 0:
        n = n // 2
    else:
        n = 3 * n + 1
    print(n)
    steps += 1

第四步:输出总步数

最后输出一共经历了多少步:

print(f"总共经历了 {steps} 步到达 1。")

🧠 完整代码示例

# 角谷猜想(Collatz Conjecture)Python 实现

n = int(input("请输入一个正整数:"))

if n <= 0:
    print("请输入一个大于0的正整数!")
else:
    steps = 0
    print(f"开始计算角谷猜想序列(初始值为 {n}):")
    print(n)

    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        print(n)
        steps += 1

    print(f"总共经历了 {steps} 步到达 1。")

📈 进阶功能建议(可选)

你可以在此基础上增加以下功能,提升学习效果:

✅ 1. 记录整个操作过程为列表

sequence = [initial_n]
while n != 1:
    if n % 2 == 0:
        n = n // 2
    else:
        n = 3 * n + 1
    sequence.append(n)
print("完整序列:", sequence)

✅ 2. 输出最大值和长度

print("最大值为:", max(sequence))
print("序列长度为:", len(sequence))

✅ 3. 绘制图像(需要 matplotlib 库)

import matplotlib.pyplot as plt

plt.plot(sequence, marker='o')
plt.title("角谷猜想变化曲线")
plt.xlabel("步数")
plt.ylabel("数值")
plt.grid(True)
plt.show()

🎯 小练习

尝试完成以下练习,加深理解:

  1. 输入 7,观察其角谷序列并统计步数。
  2. 修改代码,让程序可以连续输入多个数字,直到用户输入 0 为止。
  3. 写一个函数 collatz(n),返回该数到达 1 所需的步数。

📚 总结

通过本次教程,你学会了:

  • 什么是角谷猜想
  • 如何用 Python 模拟角谷猜想过程
  • 使用了输入处理、条件判断、循环等基础编程技巧
  • 可以进一步拓展图表可视化、数据存储等功能

📢 最后一句话

“无论起点多高,终会回到1。” —— 这就是神秘而美丽的角谷猜想!

如果你喜欢这个教程,欢迎继续探索更多 Python 数学编程内容哦 😊

2 条评论

  • @ 2025-5-17 20:27:51
    
    # 程序要求输入一个整数,
    # 求经过多少次可得到自然数 1。
    def fun(n, cnt):
      #if ① :
      if n == 1:
        print(cnt)
        return
      else:
        if n % 2 == 0:#如果是偶数,
          n //=2 #则除以 2
          #②
          #cnt += 1
          fun(n, cnt+1)
        else:
          #③
          n = n * 3 + 1
          #cnt += 1
          fun(n, cnt+1)
    
    #fun(5, ④ )
    fun(5, 0 )
    
    
    
    
    • @ 2025-5-17 20:27:35

      • 1