C&C++递归函数-输入一个正整数,将该整数的每一位数字从高位到低位顺序输出

任务描述

本关任务:输入一个正整数,然后把该整数的每一位数字从高位到低位顺序输出,每个数字占一行。

例如:输入:123,程序输出:

 
  1. 1
  2. 2
  3. 3

相关知识

对于将一个整数各位数字拆开的问题,由于该数字的位数未知,采用取余的方式也只能获得最低位,最高位很难获取(如果使用即将学习的数组,也可以实现,但不建议这样做)。而这里要求先输出最高位,所以不能用循环实现。但递归函数可以很好的解决这个问题。

递归函数

直接调用自己或通过其它函数间接调用自己的函数称为递归函数。

递归函数适合于求解递归问题,所谓递归问题:是指一类比较复杂的问题,其问题的解决又依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小,而且一旦将问题的复杂程度和规模化简到足够小时,问题的解法其实非常简单。

例如,计算某个自然数 n 的阶乘的公式写为: n!=n×(n−1)×(n−2)×...×2×1

这种阶乘的计算用如下循环结构来实现:

 
  1. int factorial = 1;
  2. for (int counter=1; counter <= n; counter ++)
  3. {
  4. factorial=factorial * counter;
  5. }

也可以从另外一个角度来看待阶乘的计算,n 的阶乘可以通过递归定义为:

 
  1. n!=n×(n -1)! (n>1)
  2. n!=1 (n=1)

例如为了计算5!,要先计算出4!,要计算4!,又要先计算出3!,要计算3!,则要先计算2!,而2!又需要先计算1!。

根据定义,1!为1,有了1!就可以计算2!了,有了2!的结果就可以计算出3!的值,有了3!的值就可以算出4!的值,最后可以得到5!的结果。

从上述递归计算过程可以看到,一个复杂的问题,被一个规模更小、更简单的类似的问题替代了,经过逐步分解,最后得到了一个规模非常小、非常简单的、更容易解决的类似的问题,将该问题解决后,再逐层解决上一级问题,最后解决了较复杂的原始的问题。

递归性质

对于递归函数而言其调用过程与一般函数的调用过程完全一样,同时函数的递归调用具有下面两个性质:

  1. 函数调用时,调用程序在函数调用处暂时挂起,程序控制离开调用程序转入被调用函数执行,只有当被调用函数执行完后,才返回到调用程序的调用处继续向下执行,所以调用函数一定要在被调用函数执行完成后才能继续执行并结束。由于递归调用中调用函数和被调用函数可能是同一个函数,同一个函数的两次调用可以理解为函数的两个不同的副本;

  2. 一个函数被调用,系统会为该函数的这次执行分配存储空间,包括为该函数的形式参数和局部变量分配单元。因此,递归函数执行时,在某一时刻,计算机内可能有该递归函数的多个活动的同时存在,每个活动(即函数的每次调用执行)都有自己对应的存储空间,也就是说,函数的形式参数和局部变量,在函数的每次调用执行中都有不同的存储空间。

使用递归函数求阶乘的程序为:

 
  1. #include <iostream>
  2. using namespace std;
  3. // 递归函数 fac: 求 num 的阶乘
  4. // 返回值:num 的阶乘
  5. int fac(int num)
  6. {
  7. if (num <= 1) // 递归终止,直接给出结果
  8. return 1;
  9. else // 递归调用
  10. return (num * fac(num - 1));
  11. }
  12. int main()
  13. {
  14. int i;
  15. cin >> i;
  16. cout << i << "! = " << fac(i) << endl;
  17. return 0;
  18. }

编程要求

在右侧编辑器中的Begin-End之间补充代码,输入一个正整数(数据由平台提供,已在主函数中获取),将该整数的每一位数字从高位到低位顺序输出,且每个数字占一行。

提示

可以设计一个递归函数 fun,其参数为 n,功能为顺序输出 n 的各位数字。

函数实现时可以将 n 拆分为两个部分:n%10n/10,即最低位和剩下的部分;程序语义应该为先顺序输出n/10的各位,然后输出n%10。顺序输出n/10的各位可以通过调用自身来实现(函数 fun 的功能就是这个),输出n%10则直接输出就好了。

#include <iostream>
using namespace std;

// 递归函数splitNum:顺序输出n的各位数字,每个数字占一行
// 返回值:无
void splitNum(unsigned int n)
{
    // 请在这里补充代码,实现递归函数splitNum
    /********** Begin *********/
    if (n<=9) cout<<n; else{
    int m=0;
	m=n%10;
    n=n/10;
    if (n>9) {splitNum(n) ;
    }else cout<<n<<endl;
    cout<<m<<endl;
    }
    
    /********** End **********/
}

int main()
{
    unsigned n;
    cin >> n;     // 输入正整数n
    splitNum(n);     // 调用splitNum函数,顺序输出n的各位数字
    return 0;
}

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值