Algorithm 如何检查数字序列是否收敛?
这是一个面试问题: 给定一个正整数n,可以使用此函数生成数字序列: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,... 很容易检查以前是否生成过数字。我的面试官问:如果
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)循环
只是为了澄清一下,序列是通过将函数反复应用于前一个结果而生成的。您可以避免使用递归函数(或者使用尾部递归,这可以轻松地展开为循环),但问题是非循环情况必须是无重复数目的无限级数,因此,您必须无限次地调用该函数,以确保情况属实。