如何实现获取Collatz序列中的最大值?现有代码待修正
如何修改collatzMax函数获取Collatz序列的最大值?
我已经实现了输出Collatz序列的writeCollatzSekvens函数,代码如下:
void writeCollatzSekvens(long int n){ cout << n << " "; while(n !=1){ if ( n % 2 == 0){ n = n/2; cout << n << " "; } else{ n = (n*3) + 1; cout << n << " "; } } }
调用writeCollatzSekvens(7)会输出:7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1。现在需要编写collatzMax函数返回该序列中的最大值(比如示例中的52),当前的collatzMax代码如下:
long int collatzMax(long int n){ int max = 0; if (n > max){ max = n; } return max; }
修改方案
当前的collatzMax函数仅检查了初始输入值,未遍历完整的Collatz序列,因此无法获取序列中的最大值。需要复刻writeCollatzSekvens的遍历逻辑,逐个生成序列元素并同步记录最大值。
修改后的完整代码:
long int collatzMax(long int n){ // 初始最大值设为序列首个元素n long int max = n; // 遍历序列直到n变为1 while(n != 1){ if (n % 2 == 0){ n = n / 2; } else { n = (n * 3) + 1; } // 每次生成新元素后,更新最大值 if (n > max){ max = n; } } return max; }
关键修改说明
- 调整
max的类型为long int:避免序列中出现超出int范围的数值时发生溢出。 - 初始化
max为输入参数n:序列的第一个元素本身可能就是最大值,不能遗漏。 - 添加循环遍历逻辑:和
writeCollatzSekvens保持一致,完整生成序列的每一个元素。 - 实时更新最大值:每生成一个新元素就对比当前最大值,确保捕获序列中的峰值。
调用collatzMax(7)会返回52,符合预期需求。
内容的提问来源于stack exchange,提问作者Snozye
相关产品推荐
相关产品推荐

