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

Algorithm 如何检查数字序列是否收敛?,algorithm,numbers,sequence,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,... 很容易检查以前是否生成过数字。我的面试官问:如果

这是一个面试问题:

给定一个正整数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呢


有什么想法吗?

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

如果序列永远不会收敛,也永远不会进入循环呢?你怎么检查

该序列的行为尚不清楚。检查这一点的唯一方法是证明它。遗憾的是,仍然没有证据。所以你可以希望它收敛到1(仍然没有找到couterexample)

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

Collatz猜想的任何反例都必须包括 无限发散轨道或不同于 平凡的(4;2;1)循环


只是为了澄清一下,序列是通过将函数反复应用于前一个结果而生成的。您可以避免使用递归函数(或者使用尾部递归,这可以轻松地展开为循环),但问题是非循环情况必须是无重复数目的无限级数,因此,您必须无限次地调用该函数,以确保情况属实。