【问题标题】:How to check if the number sequence does NOT converge?如何检查数列是否不收敛?
【发布时间】:2016-04-22 10:14:26
【问题描述】:

这是一个求职面试问题:

给定一个正整数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 怎么办?

有什么想法吗?

【问题讨论】:

  • 为了澄清,序列是通过重复应用函数到前面的结果生成的。
  • 你可以避免使用递归函数(或者使用尾递归,它可以很容易地展开成一个循环),但问题是非循环的情况必须是一个没有重复的无限级数数字,因此您必须无限次调用该函数才能确保是这种情况。

标签: algorithm numbers sequence


【解决方案1】:

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

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

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

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

Collat​​z 猜想的任何反例都必须包括 要么是无限发散轨迹,要么是一个不同于 琐碎的 (4; 2; 1) 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2016-02-22
    • 2015-08-26
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多