希尔顿序列
求解希尔顿序列(Hailstone Sequence),希尔顿序列问题是一个著名的数学问题,至今没有证明其正确性,也没证明其是错误的,即任何一个正整数N,如果是偶数的话就除以2,如果是奇数的话就乘以3再加上1,最后这个数都会变为1。其表达式如下:
H
a
i
l
s
t
o
n
e
(
n
)
=
{
{
1
}
,
if
n
equal
1
{
n
}
∪
Hailstone
(
n
/
2
)
,
if
n
is even
{
n
}
∪
Hailstone
(
3
n
+
1
)
,
if is odd
Hailstone(n)=\left\{\begin{array}{ll}\{1\}, & \text { if } \mathrm{n} \text { equal } 1 \\ \{n\} \cup \text { Hailstone }(n / 2), & \text { if } \mathrm{n} \text { is even } \\ \{n\} \cup \text { Hailstone }(3 n+1), & \text { if is odd }\end{array}\right.
Hailstone(n)=⎩⎨⎧{1},{n}∪ Hailstone (n/2),{n}∪ Hailstone (3n+1), if n equal 1 if n is even if is odd
从中我们可以通过递归发现,每次对n这个数字进行判断奇偶性,采用不同的计算公式,举例说
明:
Hailstone
(
3
)
=
{
3
}
⋃
Hailstone
(
3
∗
3
+
1
)
=
{
3
,
10
}
∪
Hailstone
(
10
/
2
)
=
{
3
,
10
,
5
}
∪
Hailstone
(
5
∗
3
+
1
)
=
{
3
,
10
,
5
,
16
}
∪
Hailstone
(
16
/
2
)
=
{
3
,
10
,
5
,
16
,
8
}
∪
Hailstone
(
8
/
2
)
=
{
3
,
10
,
5
,
16
,
8
,
4
}
∪
Hailstone
(
4
/
2
)
=
{
3
,
10
,
5
,
16
,
8
,
4
,
2
}
∪
Hailstone
(
2
/
2
)
=
{
3
,
10
,
5
,
16
,
8
,
4
,
2
,
1
}
\begin{array}{l} \text { Hailstone }(3)=\{3\} \bigcup \text { Hailstone }(3 * 3+1) \\ \qquad \begin{array}{l} =\{3,10\} \cup \text { Hailstone }(10 / 2) \\ =\{3,10,5\} \cup \text { Hailstone }(5 * 3+1) \\ =\{3,10,5,16\} \cup \text { Hailstone }(16 / 2) \\ =\{3,10,5,16,8\} \cup \text { Hailstone }(8 / 2) \\ =\{3,10,5,16,8,4\} \cup \text { Hailstone }(4 / 2) \\ =\{3,10,5,16,8,4,2\} \cup \text { Hailstone }(2 / 2) \\ =\{3,10,5,16,8,4,2,1\} \end{array} \end{array}
Hailstone (3)={3}⋃ Hailstone (3∗3+1)={3,10}∪ Hailstone (10/2)={3,10,5}∪ Hailstone (5∗3+1)={3,10,5,16}∪ Hailstone (16/2)={3,10,5,16,8}∪ Hailstone (8/2)={3,10,5,16,8,4}∪ Hailstone (4/2)={3,10,5,16,8,4,2}∪ Hailstone (2/2)={3,10,5,16,8,4,2,1}
由于不能证明这个程序的“有穷性”,故不能说该程序是一个算法。
#include <iostream>
using namespace std;
int main()
{
cout << "the input number is ";
int n;
cin >> n;
cout << "the sequense is: " << n << ' ';
while (n != 1) {
if (n & 1) {
n = n * 3 + 1;
}
else
n /= 2;
cout << n << ' ';
}
return 0;
}