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

如何用递归实现C语言整数数字的降序排序?

问题分析与修复方案

你的代码出现段错误的核心原因是逻辑缺陷导致无限递归,进而引发栈溢出。具体来说:

  • 你的代码试图通过交换最后两位数字来实现排序,但这种局部调整无法完成整体降序排列,反而会在很多场景下陷入循环调用(比如输入132时,会在132→123→132之间反复递归),最终耗尽栈空间触发段错误。
  • 递归的终止条件仅处理了单数字的情况,但整体逻辑没有覆盖完整的排序需求,无法正确完成数字降序重排。

正确的递归实现思路

我们可以采用「每次提取最大数字,递归处理剩余数字」的思路,步骤如下:

  1. 终止条件:若输入数字是个位数(小于10),直接返回该数字。
  2. 找出当前数字中的最大数字。
  3. 从原数字中移除这个最大数字,得到剩余部分。
  4. 将最大数字放在最高位,加上剩余数字递归排序后的结果,返回最终值。

修复后的代码

// 辅助函数:找出数字中的最大位
int find_max(int n) {
    int max_digit = n % 10;
    while (n > 0) {
        int current = n % 10;
        if (current > max_digit) {
            max_digit = current;
        }
        n /= 10;
    }
    return max_digit;
}

// 辅助函数:从数字中移除指定的一个数字(首次出现的)
int remove_digit(int n, int digit) {
    int result = 0;
    int power = 1;
    int removed = 0;
    while (n > 0) {
        int current = n % 10;
        if (current == digit && !removed) {
            removed = 1;
        } else {
            result += current * power;
            power *= 10;
        }
        n /= 10;
    }
    return result;
}

// 递归排序函数:数字降序重排
int sort(int n) {
    // 终止条件:单数字直接返回
    if (n < 10) {
        return n;
    }
    int max_d = find_max(n);
    int rest = remove_digit(n, max_d);
    // 计算最大数字应处的权值(如5位数的最高位权值是10000)
    int power = 1;
    int temp = n;
    while (temp >= 10) {
        power *= 10;
        temp /= 10;
    }
    // 最大数字放高位,剩余部分递归排序后拼接
    return max_d * power + sort(rest);
}

测试验证

输入26354时,函数会依次提取6、5、4、3、2,最终返回65432,符合预期。对于易触发循环的输入(如132),也能正确返回321,不会出现无限递归。

内容的提问来源于stack exchange,提问作者Daniel Levi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:52:44