如何检查数字序列是否收敛?

时间:2016-04-22 10:14:26

标签: algorithm numbers sequence

这是一份面试问题:

给定正整数n,您可以使用此函数生成一系列数字:

f(n) = n/2 if n is even
f(n) = 3*n+1 if n is odd

因此,对于n = 3,序列为:

3 10 5 16 8 4 2 1

如果你尝试一些正数,序列总是收敛到1。

现在编写一个程序来检查2-N(一个非常大的整数)之间的每个数字是否会收敛到1。

我的猜测是:如果序列没有收敛,很可能会进入这样的循环:

...,k,3k+1,...,k,...

很容易检查之前是否已生成过数字。我的采访者问:如果序列永远不会收敛并且从不进入循环怎么办?你如何检查?

如果我没有检测到这种情况,它会导致堆栈溢出,因为我使用递归函数来解决这个问题。

如果它从未进入循环,我怎么能确定它最终不会收敛?在奇数/偶数/奇数/偶数的几次迭代之后说,数字会继续变大,但如果某些3 * N + 1恰好是2的幂,它会直接收敛到1?

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

此序列是众所周知的3n+1序列,其中包含Collatz conjecture。这仍然是一个悬而未决的问题,因为这个问题非常困难。

  

如果序列永不收敛并且从不进入循环怎么办?你如何检查?

此序列的行为未知。检查这个的唯一方法是证明它。可悲的是,仍然没有证据。所以你可以希望它会收敛到1(仍然没有找到例子)。

所以你的程序应该是这样的:你开始迭代序列并将所有找到的值保存在集合中。如果您发现两次相同的值,则停止并说有一个反例。如果对于所有值,您的程序停止并且您到达1,则您已经证明2-N范围内的所有值都会收敛到1。如果你的程序没有停止,你就不能说什么。

  

Collat​​z猜想的任何反例都必须包括在内   无限发散轨迹或不同的周期   琐碎的(4; 2; 1)周期。