递归函数问题:实现将数字的各位存入整数数组
用递归函数提取数字每一位到数组的解决方案
嘿,我懂你想用递归把数字每一位存进数组的需求啦,咱们一步步捋清楚怎么实现这个功能~
核心思路拆解
递归的关键就是把大问题拆成小问题:每次先提取当前数字的最后一位,然后递归处理去掉最后一位后的剩余数字,最后把递归得到的前面几位的数组,和当前提取的数字组合起来,就能得到完整的各位数字数组啦。
这里要注意两个关键点:
- 终止条件:当数字小于10的时候,说明已经到了最高位,直接返回包含这个数字的数组就行;另外要单独处理输入为0的情况,避免出问题。
- 递归步骤:
- 用
num % 10取当前数字的最后一位 - 用
num // 10(整数除法)去掉最后一位,得到新的数字 - 递归调用函数处理这个新数字,得到前面几位的数组
- 把当前提取的最后一位加到递归结果的末尾,返回最终数组
- 用
Python代码示例(简单直观)
def num_to_array(num): # 单独处理输入为0的情况,避免递归返回空数组 if num == 0: return [0] # 终止条件:数字只剩一位,直接返回单元素数组 if num < 10: return [num] # 先递归处理前面的数字,再加上当前最后一位 return num_to_array(num // 10) + [num % 10] # 测试看看效果 print(num_to_array(3562)) # 输出: [3, 5, 6, 2] print(num_to_array(0)) # 输出: [0] print(num_to_array(9)) # 输出: [9] print(num_to_array(12345)) # 输出: [1, 2, 3, 4, 5]
代码唠一唠
- 先处理输入为0的情况,不然递归到最后会返回空数组,不符合预期
- 当数字小于10时,就不用再递归了,直接返回包含这个数字的数组就行
- 拿输入3562举例子:递归调用
num_to_array(356)会返回[3,5,6],然后加上最后一位[2],就得到了你想要的[3,5,6,2]
如果是用C语言写的话,思路类似,但要注意数组的内存分配和索引处理,这里也给个参考:
C语言代码示例
#include <stdio.h> #include <stdlib.h> // 先算一下数字有多少位,方便分配数组内存 int count_digits(int num) { if (num == 0) return 1; int count = 0; while (num != 0) { count++; num /= 10; } return count; } // 递归填充数组,先填高位再填低位 void fill_array(int num, int *arr, int index) { if (num == 0) return; // 先递归处理前面的数字,填到数组的前面索引 fill_array(num / 10, arr, index - 1); // 把当前最后一位填到对应位置 arr[index] = num % 10; } // 主函数:生成数组并返回 int* num_to_array(int num, int *returnSize) { *returnSize = count_digits(num); int *arr = (int*)malloc(*returnSize * sizeof(int)); if (num == 0) { arr[0] = 0; return arr; } fill_array(num, arr, *returnSize - 1); return arr; } // 测试一下 int main() { int size; int *arr = num_to_array(3562, &size); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); // 输出: 3 5 6 2 } free(arr); // 别忘了释放内存哦 return 0; }
C代码唠一唠
- 先用
count_digits算出数字的位数,这样就能知道要分配多大的数组内存 fill_array递归的时候先处理高位,把高位填到数组的前面位置,再填当前的最后一位,这样顺序就对了- 同样要单独处理输入为0的情况,直接把数组第一个元素设为0就行
这样不管你用Python还是C语言,都能实现你想要的功能啦~
内容的提问来源于stack exchange,提问作者Evgeni
相关产品推荐
相关产品推荐

