如何用递归实现C语言整数数字的降序排序?
问题分析与修复方案
你的代码出现段错误的核心原因是逻辑缺陷导致无限递归,进而引发栈溢出。具体来说:
- 你的代码试图通过交换最后两位数字来实现排序,但这种局部调整无法完成整体降序排列,反而会在很多场景下陷入循环调用(比如输入132时,会在132→123→132之间反复递归),最终耗尽栈空间触发段错误。
- 递归的终止条件仅处理了单数字的情况,但整体逻辑没有覆盖完整的排序需求,无法正确完成数字降序重排。
正确的递归实现思路
我们可以采用「每次提取最大数字,递归处理剩余数字」的思路,步骤如下:
- 终止条件:若输入数字是个位数(小于10),直接返回该数字。
- 找出当前数字中的最大数字。
- 从原数字中移除这个最大数字,得到剩余部分。
- 将最大数字放在最高位,加上剩余数字递归排序后的结果,返回最终值。
修复后的代码
// 辅助函数:找出数字中的最大位 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
相关产品推荐
相关产品推荐

