简单了解函数递归

函数递归

  • 一 了解函数递归
  • 二 深入理解函数递归的思想
  • 三 函数递归的优缺点

一 了解函数递归

首先,我们通过一个简单的代码来理解函数递归。

#include<stdio.h>
int Func()
{
   return Func(n+1);
}
int main()
{
  int n = 5;
  Func(n);
  return 0;
}

这个就是函数递归,简单来说就是函数自己调用自己。

二 深入理解函数递归的思想

下面,以求n的阶乘为例,来更加深入的了解函数递归。

n的阶乘就是1~n的数字累积相乘,我们知道n的阶乘的公式:n! = n ∗ (n − 1)! ,回归到这个公式的本来的推导过程,
在这里插入图片描述
也就是n!—>n*(n-1)!
(n-1)!—>(n-1)*(n-2)!
……
直到n是1或者0时,不再拆解
再稍微分析⼀下,当 n<=1 的时候,n的阶乘是1,其余n的阶乘都是可以通过上述公式计算。
n的阶乘的递归公式如下:
在这里插入图片描述
部分代码如下:

int Fact(int n)
{
 if(n<=0)
 return 1;
 else
 return n*Fact(n-1);
}

测试代码:

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

运行结果:在这里插入图片描述
画图推演:
在这里插入图片描述

在求n的乘方的推导过程中,我们发现,这样的思路就是把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较⼩的问题来求解的,也就是递归的大事化小思想。
另外,函数递归是有限制条件的,对于求n的阶乘这个问题,我们发现它的限制条件是n是1或者0时,不再拆解,并且递归的过程,n在不断的趋近1或0。

三 函数递归的优缺点

对于递归,其好处就是用少量的代码解决复杂的问题,如果以迭代的方式解决这个问题,我们会感觉代码量明显增加。


#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	if (n <= 1)
	{
		ret = 1;
		printf("%d\n", ret);
	}
	else
	{
		for (int i = 2; i <= n; i++)
		{
			ret *= i;
		}
		printf("%d\n", ret);

	}
	return 0;
}

但这并不是说递归就一定是好的,递归中,只要有函数调用,就会分配空间,递归会消耗一定的空间,还要注意递归是否栈溢出(stackoverflow)。
我们也能举出更加极端的例⼦,就像计算第n个斐波那契数,是不适合使⽤递归求解的,但是斐波那契数的问题通过是使⽤递归的形式描述的,如下:
在这里插入图片描述
看到这公式,很容易诱导我们将代码写成递归的形式,如下所⽰:

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

可是,当我们n输⼊为50的时候,需要很⻓时间才能算出结果,这个计算所花费的时间,是我们很难接受的,这也说明递归的写法是⾮常低效的,那是为什么呢?
在这里插入图片描述

其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计
算,⽽且递归层次越深,冗余计算就会越多。

我们可以作业测试:

#include <stdio.h>
int count = 0;
int Fib(int n)
{
 if(n == 3)
 count++;//统计第3个斐波那契数被计算的次数 
 if(n<=2)
 return 1;
 else
 return Fib(n-1)+Fib(n-2);
}
int main()
{
 int n = 0;
 scanf("%d", &n);
 int ret = Fib(n);
 printf("%d\n", ret); 
 printf("\ncount = %d\n", count);
 return 0;
}

输出结果:
在这里插入图片描述

那我们换成迭代的方式,我们知道斐波那契数的前2个数都1,然后前2个数相加就是第3个数,那么我们从前往后,从⼩到⼤计算就⾏了。

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;
}

迭代的⽅式去实现这个代码,效率就要⾼出很多了。
通过这个例子,可以看出,有时候,递归虽好,但是也会引⼊⼀些问题,所以我们要分辨什么时候是用递归好,什么时候是用迭代好。

小结:函数递归,博主只给你们展示了它其中的冰山一角,剩下的博主还会继续分享的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重温设计模式--设计模式七大原则

文章目录 1、开闭原则&#xff08;Open - Closed Principle&#xff0c;OCP&#xff09;定义&#xff1a;示例&#xff1a;好处&#xff1a; 2、里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;定义&#xff1a;示例&#xff1a;好处&#…

GiliSoft AI Toolkit v10.1

Gilisoft AI Toolkit是一个综合性的软件包&#xff0c;为企业和个人提供了一个集成人工智能技术到其工作流程中的解决方案。该软件包包括了多种与人工智能相关的工具&#xff0c;如聊天机器人、光学字符识别(OCR)、文本到语音(TTS)和自动语音识别(ASR)软件。它的目的是通过各种…

四种自动化测试模型实例及优缺点详解

一、线性测试 1.概念&#xff1a; 通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。 &#xff08;操作&#xff0c;重复操作&#xff0c;数据&#xff09;都混合在一起。 2.优点&#xff1a; 每个脚本相对独立&#xff0c;且不产生…

git自己模拟多人协作

目录 一、项目克隆 二、多人协作 1.创建林冲仓库 2.协作处理 3.冲突处理 三、分支推送协作 1.创建develop分支 2.发现git push无法把develop推送到远程 ​编辑 3.本地的分支推送到远程分支 四、分支拉取协作 五、远程分支的删除 远程仓库用的gitee 一、项目克隆 …

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因&#xff1a; &#xff08;1&#xff09;大量的学科&#xff08;尤其生物及材料科学&#xff09;需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解&#xff1b; &#xff08;2&#xff09;科技的发展促进了综合网…

电脑ip地址会变化吗?电脑ip地址如何固定

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;对于网络通信至关重要。然而&#xff0c;许多用户可能会发现&#xff0c;自己的电脑IP地址并非一成不变&#xff0c;而是会随着时间的推移或网络环境的变化而发生变化。这种变化有时会给用户带来困扰&#…

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

【人工智能离散数学基础】——深入详解图论:基础图结构及算法,应用于图神经网络等

深入详解图论&#xff1a;基础图结构及算法&#xff0c;应用于图神经网络等 图论&#xff08;Graph Theory&#xff09;是数学中研究图这种离散结构的分支&#xff0c;广泛应用于计算机科学、网络分析、人工智能等领域。随着图神经网络&#xff08;Graph Neural Networks, GNNs…

【docker】docker desktop 在windows上支持 host模式

针对以前的情况&#xff0c;对于 Windows 和 macOS 用户&#xff0c;是不能够使用host模式的。只能在linux上才能够使用 更新日志 docker desktop 在4.34.0版本&#xff0c;开始支持host模式。

【ALGC】探秘 ALGC—— 卓越数据处理能力的科技瑰宝

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在大数据时代&#xff0c;如何高效地处理和分析海量数据是一个核心挑战。ALGC&#xff08;Advanced Learning and Generalized Comp…

FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…

STM32 与 AS608 指纹模块的调试与应用

前言 在嵌入式系统中&#xff0c;指纹识别作为一种生物识别技术&#xff0c;广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块&#xff0c;实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…

Linux Shell 基础教程⑧

Shell 教程 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Ke…

网络刷卡器的功能和使用场景

网络刷卡器是一种连接互联网的设备&#xff0c;能够通过网络将读取到的各种卡片信息传输至服务器进行处理。这类刷卡器通常支持多种类型的卡片&#xff0c;如银行卡、身份证、会员卡、公交卡等&#xff0c;并运用现代信息技术确保数据的安全性和高效性&#xff0c;功能十分强大…

Centos7下的根口令重置与GRUB修复

目录 1. 利用GRUB进入单用户模式重置根口令&#xff1b; 步骤较多方法 步骤较少方法&#xff1a;这里主要是把重新以rw方式挂载的步骤换为了在编辑模式直接修改 2. 利用Linux系统安装光盘进入急救模式重置根口令&#xff1b; 3. 如果GRUB损坏&#xff0c;利用Linu…

赋能新一代工业机器人-望获实时linux在工业机器人领域应用案例

在工业4.0蓬勃发展的当下&#xff0c;工业机器人作为制造业转型升级的中流砥柱&#xff0c;正朝着超精密、极速响应的方向全力冲刺。然而&#xff0c;为其适配理想的望获实时Linux系统&#xff0c;却犹如寻找开启宝藏之门的关键钥匙&#xff0c;成为众多企业在智能化进程中的棘…

“无需代码,一句需求,立刻看到你的创意变成网页”==>前端AI工具 “V0”

想象一下&#xff0c;一个能帮你跳过所有烦人的代码编写过程&#xff0c;直接根据你的需求生成页面的 AI&#xff01;没错&#xff0c;这就是 v0&#xff01;你只需要用自然语言描述你想要的界面&#xff0c;v0 就会挥一挥它的“魔法鼠标”&#xff0c;立刻生成漂亮的 UI 代码。…

C语言(一)——初识C语言

目录 简单认识一段代码 数据类型 变量和常量 变量的作用域和变量的生命周期 常量 字符串 转义字符 注释 函数 数组 操作符 关键字 结构体 结构的声明 结构成员的类型 结构体变量的初始化 结构体传参 简单认识一段代码 main()函数是程序的入口&#xff0c;所以…

频繁拿下定点,华玉高性能中间件迈入商业化新阶段

伴随着智能驾驶渗透率的快速增长&#xff0c;中国基础软件市场开始进入黄金窗口期。 近日&#xff0c;华玉通软&#xff08;下称“华玉”&#xff09;正式获得某国内头部轨道交通产业集团的智能化中间件平台定点项目。这将是华玉在基础软件领域深耕和商业化发展过程中的又一重…