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

【通关函数的递归】--递归思想的形成与应用

 

目录

一.递归的概念与思想

1.定义 

2.递归的思想

3.递归的限制条件

二.递归举例

1.求n的阶乘

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

三.递归与迭代 


前言:上篇博文分享了扫雷游戏的实现,这篇文章将会继续分享函数的递归相关知识点,让大家了解并掌握递归的思路;

往期回顾: 

【趣味小游戏】--扫雷游戏


一.递归的概念与思想

1.定义 

---递归其实是一种解决问题的方法,在c语言中递归就是函数自己调用自己,举个最简单的例子:

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

上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最后也会陷入死递归,导致栈溢出(stack overflow)。

2.递归的思想

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

--递归中的递就是递推的意思,归就是回归的意思。

3.递归的限制条件

递归在书写的时候,有两个必要条件:

--递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。

--每次递归调用之后越来越接近这个限制条件。

在下面的举例中,我们会逐步体会这两个条件。


二.递归举例

1.求n的阶乘

n的阶乘的递归公式:

所以我们就可以写出函数Fact求n的阶乘;

#define _CRT_SECURE_NO_WARNINGS
#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", ret);return 0;
}

 画图推演:

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

 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)

所以我们就可以据此写出代码:

void Print(int n)
{if (n > 9){Print(n / 10);}printf("%d ", n % 10);
}
int main()
{int m = 0;scanf("%d", &m);Print(m);return 0;
}

画图推演: 


三.递归与迭代 

我们直接通过求第n个斐波拉契数来直观的了解一下两种方法;

1.递归

先看下递归的公式

#include<stdio.h>int fib(int n)
{if (n <= 2)return 1;elsereturn fib(n - 1) + fib(n - 2);
}
int main()
{int n = 0;scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);return 0;
}

 2.迭代(可以简单理解为循环)

#include<stdio.h>int fib(int n)
{int a = 1;int b = 1;int c = 1;while (n > 2){c = a + b;a = b;b = c;n--;}return c;
}int main()
{int n = 0;scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);return 0;
}

--通过这两个方法可以看出递归虽好,但是也会引入一些问题,所以一定不要迷恋递归。比如这里数大了之后计算就非常沉余了。迭代的方法去实现这个代码,效率就要高出很多了。


结语:感谢大家的支持,如果有兴趣的话,大家可以用递归的方法来尝试解决一下青蛙跳台问题和汉诺塔问题;

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

相关文章:

  • 正余弦位置编码和RoPE位置编码
  • Spring Security
  • 【C语言】C语言动态内存管理
  • 深度学习(第2章——卷积和转置卷积)
  • Python设计模式:MVC模式
  • C++学习笔记(三十八)——STL之修改算法
  • Python面向对象编程相关的单选题和多选题
  • 服务器部署LLaMAFactory进行LoRA微调
  • 大语言模型的“模型量化”详解 - 03:【超轻部署、极致推理】KTransformers 环境配置 实机测试
  • 蓝桥杯 1. 四平方和
  • Ubuntu主机上通过WiFi转有线为其他设备提供网络连接
  • 【Pandas】pandas DataFrame dot
  • JavaScript性能优化实战(4):异步编程与主线程优化
  • Linux网络编程 深入Linux网络栈:原始套接字链路层实战解析
  • 中式面点实训室建设规划与功能布局方案
  • esp32c3 合宇宙
  • 【FAQ】针对于消费级NVIDIA GPU的说明
  • 驱动安装有感叹号之关闭dell window11 笔记本数字签名
  • Day-3 应急响应实战
  • Java转Go日记(十二):Channel
  • python 练习 二
  • Spring 过滤器详解:从基础到实战应用
  • 算法题(133):二维差分
  • 2025年数字化转型前沿趋势:从数字孪生到认知智能
  • 电力作业安全工器具全解析:分类、配置与检查要点
  • 如何模拟黑客攻击(Red Teaming)以测试服务器安全性
  • istio使用ingress gateway通过header实现对不同服务的路由
  • 软件测试报告核心内容详解(附真实案例模板)
  • SQLPandas刷题(LeetCode3451.查找无效的IP地址)
  • 硬件设计器件选型之②瞬态电压抑制二极管(TVS)