0
点赞
收藏
分享

微信扫一扫

Python 中冰雹序列及解决思路

让我们首先了解python中冰雹序列的序列是什么。序列是遵循特定模式的有序数字系列。序列可以是一系列奇数一样简单的东西。冰雹序列是一系列数字,这些数字在遵循模式时增加和减少,最终在发现重复模式时结束。

冰雹序列简介

冰雹序列由冰雹猜想生成。也被称为克拉茨猜想、3n+1猜想,因为由一个日本人传入中国,又称为谷角猜想。这是数学家克拉茨提出的一个问题。它之所以被称为冰雹序列,因为该序列类似于冰雹的形成模式,序列中的数值交替增加或减少。

我们可以从一个任意整数开始。一个给定的数字 N。如果数字 N 是偶数,我们将它除以 2。否则,如果 N 是奇数,则将 N 乘以 3 并加 1 。无论我们从哪个数字开始,序列永远不会是无限的,总是以 4、2、1 结束。

让我们通过举例来理解冰雹序列。

冰雹序列示例

「N = 5」

让我们取 N = 5。由于 N 为奇数,我们将执行 (3*N + 1) = (3*5 + 1) = 16

现在,16 是偶数,所以我们将其除以 2 = 16/2 = 8

我们将在整个系列中遵循相同的模式。

8 是偶数,所以 8/2 = 4 4 是偶数,所以 4/2 = 2 2 是偶数,所以 2/2 = 1 1 是奇数,所以 (3*1 + 2) = 4。现在,正如你所看到的,这个序列正在重复。它再次生成了 4 个。所以序列到此为止。

因此,N = 5 的序列为

[5, 16, 8, 4, 2, 1]

「N = 6」

让我们再举一个 N = 6 的例子

6 是偶数,所以 6/2 = 3 是奇数,所以 (3*3 + 1) = 10 10 是偶数,所以 10/2 = 5 是奇数,所以 (3*5 + 1) = 16 16 是偶数,所以 16/2 = 8 8 是偶数,所以 8/2 = 4 4 是偶数,所以 4/2 = 2 2 2 是偶数,所以 2/2 = 1 1 是奇数,所以 (3*1 + 1) = 4。

N = 6 的冰雹序列为 

[6、3、10、5、16、8、4、2、1]

如所见,对于 n = 6,序列也以 4、2、1 结尾并且是有限的。

计算序列

让我们用 python 编写一个程序来计算冰雹序列。我们将尝试以递归和非递归方式实现它。该序列将通过从用户那里获取序列的初始编号作为输入来生成。输出将是 python 中生成的冰雹序列以及查找整个序列所采取的步骤数。

无递归(while 循环)

首先,我们将定义一个名为 hailstone() 的函数。

def hailstone(n):
  hailstone_list = []
  hailstone_list.append(int(n))
  while n != 1:
    if n % 2 == 0:
      n = n/2
      hailstone_list.append(int(n))
    else:
      n = 3*n + 1
      hailstone_list.append(int(n))
  return hailstone_list

它将接受一个参数 n – 这是序列的起始编号,并将返回一个列表。如果 n 变为 1,将有一个 while 循环将停止执行。我们有一个名为 hailstone_list 的列表,它将存储序列。如果 n 是偶数,则 n 将除以 2,否则它将乘以 3,然后将 1 添加到其中。这些数字将追加在清单上。

n = int(input("请输入一个整数 n:"))
hailstone_list = []
hailstone_list = hailstone(n)
print("Hailstone Sequence for n = {} is : {}".format(n, hailstone_list)) 
print("Number of steps is : ",len(hailstone_list))

在这里,n由用户输入。我们通过传递 n 作为参数来调用 hailstone 函数,并将返回值存储在一个空列表hailstone_list中。然后 print 语句将打印冰雹序列和步数。

输出

请输入一个整数 n:7

Hailstone Sequence for n = 7 is : [7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

Number of steps is :  17

这里序列也以 4、2、1 结尾。

使用递归

现在,我们将借助递归在 python 中实现冰雹序列。如果 n 为 1,我们将返回hailstone_list。如果 n 是偶数,我们将通过递归调用 hailstone() 函数并传递 n/2 作为参数。否则,如果 n 是偶数,我们将通过递归调用 hailstone() 函数,但将 (3*n + 1) 作为函数的参数传递。

hailstone_list = []
def hailstone(n):
  hailstone_list.append(int(n))
  if n == 1:
    return hailstone_list
  while n != 1:
    if n % 2 == 0:
      return hailstone(int(n/2))
    else:
      return hailstone(int(3*n + 1))
 
n = int(input("请输入一个整数 n:"))
hailstone_list = []
hailstone_list = hailstone(n)
print("Hailstone Sequence for n = {} is : {}".format(n, hailstone_list)) 
print("Number of steps is : ",len(hailstone_list))

不同值的 n 的输出为:

N = 7:

请输入一个整数 n:7
Hailstone Sequence for n = 7 is : [7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
Number of steps is :  17

N = 6:

请输入一个整数 n:6
Hailstone Sequence for n = 6 is : [6, 3, 10, 5, 16, 8, 4, 2, 1]
Number of steps is :  9

即使对于较大的 n 值,序列也应始终以4,2, 1 结尾。

请输入一个整数 n:19840

Hailstone Sequence for n = 19840 is : [19840, 9920, 4960, 2480, 1240, 620, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]

Number of steps is :  93

常见问题

问:最长的冰雹序列是多少?

一个。最长的冰雹序列是数字 77031,长度为 351。

请输入一个整数 n:77031

Hailstone Sequence for n = 77031 is : [77031, 231094, 115547, 346642, 173321, 519964, 259982, 129991, 389974, 194987, 584962, 292481, 877444, 438722, 219361, 658084, 329042, 164521, 493564, 246782, 123391, 370174, 185087, 555262, 277631, 832894, 416447, 1249342, 624671, 1874014, 937007, 2811022, 1405511, 4216534, 2108267, 6324802, 3162401, 9487204, 4743602, 2371801, 7115404, 3557702, 1778851, 5336554, 2668277, 8004832, 4002416, 2001208, 1000604, 500302, 250151, 750454, 375227, 1125682, 562841, 1688524, 844262, 422131, 1266394, 633197, 1899592, 949796, 474898, 237449, 712348, 356174, 178087, 534262, 267131, 801394, 400697, 1202092, 601046, 300523, 901570, 450785, 1352356, 676178, 338089, 1014268, 507134, 253567, 760702, 380351, 1141054, 570527, 1711582, 855791, 2567374, 1283687, 3851062, 1925531, 5776594, 2888297, 8664892, 4332446, 2166223, 6498670, 3249335, 9748006, 4874003, 14622010, 7311005, 21933016, 10966508, 5483254, 2741627, 8224882, 4112441, 12337324, 6168662, 3084331, 9252994, 4626497, 13879492, 6939746, 3469873, 10409620, 5204810, 2602405, 7807216, 3903608, 1951804, 975902, 487951, 1463854, 731927, 2195782, 1097891, 3293674, 1646837, 4940512, 2470256, 1235128, 617564, 308782, 154391, 463174, 231587, 694762, 347381, 1042144, 521072, 260536, 130268, 65134, 32567, 97702, 48851, 146554, 73277, 219832, 109916, 54958, 27479, 82438, 41219, 123658, 61829, 185488, 92744, 46372, 23186, 11593, 34780, 17390, 8695, 26086, 13043, 39130, 19565, 58696, 29348, 14674, 7337, 22012, 11006, 5503, 16510, 8255, 24766, 12383, 37150, 18575, 55726, 27863, 83590, 41795, 125386, 62693, 188080, 94040, 47020, 23510, 11755, 35266, 17633, 52900, 26450, 13225, 39676, 19838, 9919, 29758, 14879, 44638, 22319, 66958, 33479, 100438, 50219, 150658, 75329, 225988, 112994, 56497, 169492, 84746, 42373, 127120, 63560, 31780, 15890, 7945, 23836, 11918, 5959, 17878, 8939, 26818, 13409, 40228, 20114, 10057, 30172, 15086, 7543, 22630, 11315, 33946, 16973, 50920, 25460, 12730, 6365, 19096, 9548, 4774, 2387, 7162, 3581, 10744, 5372, 2686, 1343, 4030, 2015, 6046, 3023, 9070, 4535, 13606, 6803, 20410, 10205, 30616, 15308, 7654, 3827, 11482, 5741, 17224, 8612, 4306, 2153, 6460, 3230, 1615, 4846, 2423, 7270, 3635, 10906, 5453, 16360, 8180, 4090, 2045, 6136, 3068, 1534, 767, 2302, 1151, 3454, 1727, 5182, 2591, 7774, 3887, 11662, 5831, 17494, 8747, 26242, 13121, 39364, 19682, 9841, 29524, 14762, 7381, 22144, 11072, 5536, 2768, 1384, 692, 346, 173, 520, 260, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

Number of steps is :  351

冰雹序列是否已解决?

已检查冰雹序列的二到六十次方数 (2^60)。直到这个数字生成的所有序列都被证明是一个以相同模式结尾的有限序列——4、2、1。

举报

相关推荐

0 条评论