编写函数获取Collatz序列中的最大值(非序列长度)
实现返回Collatz序列最大值的C语言函数
需求是编写函数,返回给定数字n对应的Collatz序列中的最大值(例如n=7时返回52)。先看你提供的代码存在的问题:
- 代码开头直接递归调用
collatz_max(n),没有终止条件,会触发无限递归 - 每次递归都会重新初始化
max=0,无法保留序列中已出现的最大值 - 代码末尾存在多余的闭合大括号,属于语法错误
- 未处理Collatz序列的终止条件(当n=1时停止生成序列)
修正后的迭代实现(推荐,避免栈溢出)
迭代方式更适合处理较大的n,不会因递归深度过大导致栈溢出:
int collatz_max(int n) { int max = n; // 初始最大值为输入的n while (n != 1) { if (n % 2 == 0) { n /= 2; } else { n = n * 3 + 1; } if (n > max) { max = n; } } return max; }
逻辑说明:
- 初始将最大值
max设为输入的n,因为n本身是序列的第一个元素 - 循环生成序列的下一个元素,直到n变为1(Collatz序列的终止点)
- 每次生成新的n后,若其大于当前
max则更新max - 循环结束后返回
max,即为序列中的最大值
递归实现(需辅助函数传递最大值)
如果偏好递归写法,需要通过辅助函数传递当前已记录的最大值,避免每次递归重置最大值:
// 辅助递归函数,负责生成序列并更新最大值 static int collatz_recur(int n, int current_max) { if (n == 1) { return current_max; } int next_n = (n % 2 == 0) ? n / 2 : n * 3 + 1; int new_max = (next_n > current_max) ? next_n : current_max; return collatz_recur(next_n, new_max); } // 对外暴露的接口函数 int collatz_max(int n) { return collatz_recur(n, n); }
逻辑说明:
- 对外函数
collatz_max调用辅助递归函数,初始current_max设为n - 辅助函数每次计算序列的下一个元素,更新最大值后继续递归
- 当n变为1时,返回当前记录的最大值
验证n=7的场景:序列为7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1,最大值为52,两种实现均可正确返回该结果。
内容的提问来源于stack exchange,提问作者ezar hanna
相关产品推荐
相关产品推荐

