使用 C++,我正在编写一个程序,该程序将从 1 开始获取前 n 个数字并输出它们各自的“路径计数”,这就是我所说的从数字到零所需的 Collatz 序列的迭代次数(请参阅有关 Collatz 猜想的Wikipedia 文章)。例如,路径编号 8 为 3,因为到达 1 需要 3 步(8:2 = 4;4:2 = 2;2:2 = 1)。
因此,我们有一个简单的功能:
int pathNumber(int n){
int pathCount = 0;
while(n > 1){
if(n % 2 == 0){
n /= 2;
}else{
n *= 3;
n ++;
}
pathCount ++;
}
return pathCount;
}
然后我决定写一个它的反函数(称为 firstInstanceOf(n)),它将计算任何给定 pathNumber 的第一个实例,从 1 开始按升序排列。例如,firstInstanceOf(3) 将是 8,因为 8 是第一个从1升序排列的数字,其pathCount为3。我写的函数如下:
int firstInstanceOf(int s){
int i = 0;
while(pathNumber(i) != s){
i ++;
}
return i;
}
其中 s 是输入值,i 是每次递增 1 的变量。看起来很简单,代码编译时没有任何警告,但根本不会计算。我曾尝试将后一个函数重新格式化为 for 循环、无限循环等,但程序仍然会无限期地缓冲或输出虚假值。我觉得我错过了一些非常明显的东西?任何帮助表示赞赏。