当前位置: 首页 > ds >正文

c语言---函数递归(详解)

目录

  • 一、递归是什么?
    • 1.简单的c语言递归代码
    • 2.递归的思想
    • 3.递归的限制条件
  • 二、递归举例
    • 1.求n的阶乘
      • 1.1分析和代码实现
        • 1.1.1完整代码
        • 1.1.2运行结果
        • 1.1.3以5的阶乘对代码画图进行解释
    • 2.顺序打印整数的每一位
      • 2.1代码的分析和实现
        • 2.1.1完整代码
        • 2.1.2运行结果
        • 2.1.3画图进行分析解释
  • 三、总结

一、递归是什么?

递归其实是解决问题的方法,在c语言中,递归就是函数自己调用自己。

1.简单的c语言递归代码

#include <stdio.h>
int main()
{printf("Hello World!\n");main();//main函数中⼜调⽤了main函数return 0;
}

上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)。

2.递归的思想

把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了。所以递归的思考方式就是把大事化小的过程。递归中的递就是递推的意思,归就是回归的意思。

3.递归的限制条件

递归在书写的时候,有2个必要条件:
• 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
• 每次递归调用之后越来越接近这个限制条件。
在下⾯的例子中,我们逐步体会这2个限制条件。

二、递归举例

1.求n的阶乘

一个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1。⾃然数n的阶乘写作n!。

1.1分析和代码实现

n的阶乘的公式:n!=n*(n-1)

例:5! = 5*4*3*2*14! = 4*3*2*1所以:5! = 5*4!

这样的思路就是把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较⼩的问题来求解的。当n等于0时,n的阶乘是1,其余的都可以通过公式来计算。
n的阶乘的递归公式如下:
在这里插入图片描述
那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘,函数如下:

int Fact(int n)
{if(n==0)return 1;elsereturn n*Fact(n-1);
}
1.1.1完整代码
#include <stdio.h>
int Fact(int n)
{if(n==0)return 1;elsereturn n*Fact(n-1);
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d\n", ret);return 0;
}
1.1.2运行结果

在这里插入图片描述

1.1.3以5的阶乘对代码画图进行解释

在这里插入图片描述

2.顺序打印整数的每一位

比如:
输入:1234
输出:1234

2.1代码的分析和实现

这个题⽬,放在我们⾯前,⾸先想到的是,怎么得到这个数的每⼀位呢?
如果n是⼀位数,n的每⼀位就是n自己,n是超过1位数的话,就得拆分每⼀位。
1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推不断的 %10 和 /10 操作,直到1234的每⼀位都得到,但是这⾥有个问题就是得到的数字顺序是倒着的,但是是我们有了灵感,我们发现其实⼀个数字的最低位是最容易得到的,通过%10就能得到
那我们假设想写⼀个函数Print来打印n的每⼀位,如表示:

Print(n)
如果n是1234,那表⽰为
Print(1234) //打印1234的每⼀位
其中1234中的4可以通过%10得到,那么
Print(1234)就可以拆分为两步:
1. Print(1234/10) //打印123的每⼀位
2. printf(1234%10) //打印4
完成上述2步,那就完成了1234每⼀位的打印
那么Print(123)⼜可以拆分为Print(123/10) + printf(123%10)

以此类推得到:

 Print(1234)
==>Print(123) + printf(4)
==>Print(12) + printf(3)
==>Print(1) + printf(2)
==>printf(1) 

直到被打印的数字变成⼀位数的时候,就不需要再拆分,递归结束。
那么代码完成也就⽐较清楚啦

2.1.1完整代码
#include<stdio.h>
void print(int n)
{if (n > 9){print(n/10);}printf("%d", n%10);
}
int main()
{int n = 0;scanf("%d", &n);print(n);//用来顺序打印每一位整数
}
2.1.2运行结果

在这里插入图片描述

2.1.3画图进行分析解释

在这里插入图片描述

三、总结

递归中的递就是递推的意思,归就是回归的意思。
在这里插入图片描述

在这里插入图片描述
欧耶!!!!我学会啦!!!!!

http://www.xdnf.cn/news/11515.html

相关文章:

  • Android 平台 metaRTC使用源码调试
  • MOS管工作原理精讲
  • 软件测试人员必备的60个测试工具,果断收藏了!_测试工程师必备软件_
  • linux 无法挂载目录mnt,详解linux下mnt目录作用
  • QSS语法介绍
  • JavaScript基础一、简介
  • 波动方程
  • 专家系统是什么
  • Redis设计与实现之RDB
  • Android中的Service详解
  • 无需专业技能,轻松创建个人博客:Cpolar+Emlog在Ubuntu上的搭建指南
  • Linux下deamon(服务)的实现
  • “qvod专用播放器”是专门为H网而做的吗?
  • CTF是什么?一文带你读懂网络安全大赛
  • JavaScript之正则表达式的使用方法详细介绍
  • jQuery 中常用的API
  • Openfire源码分析
  • Linux系统查询磁盘空间大小(df、du)
  • windows下安装exiftool 进行无人机图像数据信息查看
  • Red Hat基本命令的使用
  • 推荐一些python的论坛,一起学习才有意思!
  • H264编码基础概念+格式分析
  • Zeromq模式详解
  • UAC 实现原理及绕过方法
  • 【infiniband】SDR、DDR、QDR、FDR、EDR、HDR、NDR
  • 一文读懂ISM频段
  • asio中的锁到底严不严重
  • 拟合是什么意思
  • 转载--Linux下Modules的概念及使用详解
  • 什么是域名 --每天一个小知识