You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写函数获取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;
}

逻辑说明:

  1. 初始将最大值max设为输入的n,因为n本身是序列的第一个元素
  2. 循环生成序列的下一个元素,直到n变为1(Collatz序列的终止点)
  3. 每次生成新的n后,若其大于当前max则更新max
  4. 循环结束后返回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);
}

逻辑说明:

  1. 对外函数collatz_max调用辅助递归函数,初始current_max设为n
  2. 辅助函数每次计算序列的下一个元素,更新最大值后继续递归
  3. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:50:18