【发布时间】: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