js实现对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过
时间: 2023-04-29 11:06:00 浏览: 111
题目描述:实现对任何一个整数n,如果它是偶数,则把它除以2;如果它是奇数,则把它乘以3再加上1。这样一直反复做下去,最后一定会得到n=1。
这是一个经典的数学问题,也叫Collatz猜想。目前尚未找到反例证明其是否成立。
相关问题
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展…… 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
这个问题可以使用递归的方式来解决。如果 n=1,则不需要砍,返回 0;如果 n 是偶数,则砍掉一半,递归调用函数计算剩余部分需要砍的步数;如果 n 是奇数,则砍掉 (3n+1) 的一半,递归调用函数计算剩余部分需要砍的步数。最终将所有步数相加即可得到答案。
以下是实现该算法的 Python 代码:
def kala(n):
if n == 1:
return 0
elif n % 2 == 0:
return 1 + kala(n // 2)
else:
return 1 + kala(3 * n + 1)
n = int(input("请输入一个不超过 1000 的正整数:"))
print("需要砍 %d 次才能得到 n=1" % kala(n))
卡拉兹(callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展…… 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
根据卡拉兹猜想,对于任何一个正整数 n,不断进行砍半或者砍掉 (3n+1) 直到得到 n=1。因此,我们可以写一个循环来模拟这个过程,每次砍一半或者砍掉 (3n+1),并记录砍的次数,直到 n=1 为止。具体实现可以参考以下代码:
n = int(input("请输入一个不超过100的正整数:"))
count =
while n != 1:
if n % 2 == :
n = n // 2
else:
n = (3 * n + 1) // 2
count += 1
print("需要砍 %d 次才能得到 n=1。" % count)
运行程序后,输入一个不超过100的正整数,程序会输出需要砍几次才能得到 n=1。例如,输入 6,程序会输出:
需要砍 2 次才能得到 n=1。
这说明对于正整数 6,需要砍两次才能得到 n=1。同理,我们可以对任意不超过100的正整数进行计算。
阅读全文