你是真的“C”——详解函数递归

news2024/10/1 3:25:40

详解函数递归运用😎

  • 前言🙌
    • 一、什么是递归🙌
    • 二、递归运用的两个必要条件🙌
    • 三、递归与迭代🙌
  • 总结撒花💞

哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!在学习C语言函数时,想必大家对函数递归这个模块的知识点还是感到比较玄妙的,我开始学函数递归的时候给我的感受就是它很奇妙,但是对它如何递?又如何归?的过程不是很了解。经过我这几天的刻苦学习,终于领悟到了它的精髓!本文的知识干货满满,千万不要错过哟!😍😍😍好啦,废话不多说,下面就带着大家学习函数递归的知识。😘

一、什么是递归🙌

什么是递归呢❓简单来说,程序调用自身的编程技巧称为递归(recursion)函数递归这种方法,通常把一个大型复杂的问题层层转化成一个与原问题相似的规模较小的问题来求解的递归策略。只需要少量的代码就可以描述出解题过程中所需要的大量的重复计算,大大减少了程序的代码量。递归的主要思考方式: 把大事化小,函数从哪里调用就返回到哪里

二、递归运用的两个必要条件🙌

1. 存在限制条件,当满足这个限制条件时,递归便不再继续。
2. 每次递归调用之后越来越接近这个限制条件。

   看着文字,大家可能还是感到有些困惑,接下来我举几个例子帮助大家更好的了解函数递归的这两个条件。😊
例一:接受一个整型值(无符号),按照顺序打印它的每一位。
例如:输入1234,输出1 2 3 4
画图分析:😍
在这里插入图片描述
在这里插入图片描述

解题代码: 😍

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(int n)
{
	if (n > 10)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num = 1234;
	print(num);
	return 0;
}

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

例二:
编写一个函数不允许创建临时变量,求字符串的长度
画图分析:😍
在这里插入图片描述

在这里插入图片描述

解题代码:😍

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int  my_strlen(const char*str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return my_strlen(str + 1) + 1;
	}
}
int main()
{
	char arr[] = "abcd";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

运行结果
在这里插入图片描述
看了上面的代码,比起你写的非递归方式是不是在代码量上有所减少呢😃。哎呀,忙活了一个多小时,终于分析整理出来啦,只要大家能够看懂,理解递归调用的精髓就值啦!
这里小小总结一下吧:首先要知道函数递归的两个必要条件,然后真正了解到核心思想:大事化小,函数从哪里调用就返回到哪里。

三、递归与迭代🙌

虽然递归写出来可以减少代码量,但是它也有缺点。为什么这么说呢?接下来举一个经典的例子,大家就知道啦,废话不多讲,分析如下!🙌
例子:求第n个斐波那切数(不考虑溢出问题)

画图分析: 😍
在这里插入图片描述
解题代码:😍

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int num = fib(n);
	printf("第%d个斐波那契数为:%d", n, num);
	return 0;
}

测试代码,看看第10个斐波那契数是否为55:
在这里插入图片描述
这个例子是不考虑溢出的情况,所以只针对例子来说的话是没毛病的,但是实际上它存在溢出的问题。如果利用递归的方法的话,求第50个菲波那切数程序会消耗特别多的时间。我亲测是十分钟左右才跑出来。当求第10000个斐波那契数的时候,程序会崩掉。为什么会这样呢?我发现,在fib函数调用的时候,有很多重复的运算。如下图可知,当求第50个斐波那契数时,关于44这个的展开就已经重复出现很多次了,一直画下去的话,可想而知有多少数字是被重复展开计算的!
画图分析: 😍
在这里插入图片描述
因此,这里用非递归的方式来求解斐波那契数这个问题,效率更好,虽然递归代码看起来很少,但这里内部是进行很多运算的,很多重复的运算在里面,从而使栈溢出
非递归的方法实现: 😍
首选先定义三个变量,当n >= 2的时候,pre与next都是赋值为1,pre+next = resurt当n>2时,

画图分析:

在这里插入图片描述

非递归解题代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int fib(int n)
{
	int pre;
	int next = 1;
	int resurt = 1;
	while (n > 2)
	{
		n -= 1;
		pre = next;
		next = resurt;
		resurt = pre + next;
	}
	return resurt;
}
int main()
{
	int n = 0;
	scanf("%d", & n);
	int c = fib(n);
	printf("%d", c);
}

总结撒花💞

    许多问题是已递归的形式所解释的,这只是因为它比非递归的形式更为清晰。但是,这些问题的迭代实现往往比递归实现的效率更高,虽然代码的可读性稍微差些。所以对于递归的使用,要看具体问题具体分析,不要死用递归来解题本篇文章旨在带领大家学习函数递归的知识, 如果我写的有什么的不好之处或者不足之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长安链 VM Engine架构设计深度解读

VM Engine是长安链智能合约引擎的推荐选型&#xff0c;采用Docker容器化架构&#xff0c;容器内部由一个任务调度器和多个合约进程组成&#xff0c;实现了多合约隔离与多进程并发&#xff0c;支持独立部署&#xff0c;目前支持Golang语言合约。 1. 背景说明 自2009年11月以来&…

CUDA 冬令营1

基本概念 1.CPU的任务&#xff1a;为串行任务优化 2.GPU的任务&#xff1a;为并行任务优化 3.L4T ubuntu&#xff1a;基于NVIDIA Tegra芯片的ubuntu系统&#xff08;linux for Tegra&#xff09; 4.Tegra&#xff1a;继承了ARM CPU 和 NVIDIA GPU的处理器芯片 5.X86&#xff1…

2023京东年货节全民炸年兽活动最详细规则

2023京东全民炸年兽活动规则 1、活动时间 整体活动时间: 2022年12月26日00: 00: 00–2023年01月15日23: 59: 59 2、活动玩法 (1)玩法一:全民炸年兽瓜分10亿压岁钱 活动时间: 2022年12月26日00: 00: 00–2023年01月15日23: 59: 59 (2) 玩法二:每晚8点分百万红包 活动时间…

Houdini和C4D区别在哪?哪个更好用

Houdini和C4D作为当前软件市场上非常热门的设计软件&#xff0c;现在越来越多的小伙伴开始学习。所以咱们今天就从行业应用、建模、动画和使用难易度等进行多方面对比&#xff0c;帮助小伙伴们更清楚地了解这两款软件—— Houdini作为一款非常受欢迎的3D&VFX制作工具&#…

美国公司是如何搞创新的,又是如何失败的......

PARC&#xff0c;施乐帕洛阿图研究中心&#xff0c;和贝尔实验室媲美的IT界圣地。从这里走出了一大批伟大的发明&#xff0c;直接改变了整个计算机行业。Alto PC &#xff0c;图形用户界面&#xff0c;所见即所得&#xff0c;以太网&#xff0c;PostScript&#xff0c;面向对象…

复购高,退货低的日本市场成为跨境电商新风口,新手如何快速入局

据统计预测&#xff0c;未来几年将会有越来越多的跨境卖家涌入日本电商市场。但由于在语言、文化和消费习惯上存在一定的差异&#xff0c;很多中国卖家并不熟悉日本的文化与市场需求&#xff0c;也很难在短时间内快速适应日本电商平台的运营规则与服务。 日本作为一个经济发达的…

【PS-选区编辑】变换选区、反向命令、建立工作路径

目录 变换选区 1、位置 2、多种操作 反向命令 1、反选选区&#xff1a;ctrlshifti 2、边界 3、平滑 4、扩展和收缩 5、羽化 建立工作路径 变换选区 1、位置 制作了一个制作了选区后&#xff0c;鼠标右击找到【变换选区】&#xff0c;或在【选择】菜单中找到【变换…

JavaScript 入门基础 - 运算符(三)

JavaScript 入门基础 - 运算符&#xff08;三&#xff09; 文章目录JavaScript 入门基础 - 运算符&#xff08;三&#xff09;1.什么是运算符2.表达式和返回值3.算术运算符概述4. 赋值运算符5.递增和递减运算符5.1 递增和递减运算符概述5.2 递增运算符5.2.1 前置递增运算符5.2.…

Ajax(1)---了解Ajax和XML

目录 Ajax XML了解 Ajax的特点 HTTP协议请求报文与响应文本结构 HTTP 请求报文 响应报文 Ajax AJAX全称为Asynchronous JavaScript And XML&#xff0c;就是异步的JS和XML通过AJAX可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势:无刷新获取数据。AJAX不是新…

一篇带你彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 一篇带你彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收…

MySQL 大表优化方案

单表优化 读写分离 缓存 表分区 垂直拆分 水平拆分 兼容MySQL且可水平扩展的数据库 NoSQL 当MySQL单表记录数过大时&#xff0c;增删改查性能都会急剧下降&#xff0c;可以参考以下步骤来优化&#xff1a; 单表优化 除非单表数据未来会一直不断上涨&#xff0c;否则不…

通过Django发送邮件

通过Django发送邮件非常的简单&#xff0c;在Python中已经内置了一个smtplib邮件发送模块&#xff0c;Django在此基础上进行了简单地封装&#xff0c;我们可以在Django的环境中方便的发送邮件。大部分邮件发送成功主要是邮件的参数配置&#xff0c;本文以常用的126邮箱和QQ邮箱…

《2022中国数据智能产业图谱3.0版》重磅发布

‍数据猿出品本次“数据猿行业盘点季大型主题策划活动——《2022中国数据智能产业图谱3.0版》”为2022年度图谱版本的升级更新版&#xff0c;下一次版本迭代将于2023年4月底发布2023年1.0版&#xff0c;敬请期待&#xff0c;欢迎报名。‍数据智能产业创新服务媒体——聚焦数智 …

svn修改提交日志信息

参考&#xff1a;唐小码个人博客 一、svn修改提交的msg信息和作者信息 鼠标右键找到show log> 选择要修改的日志行&#xff0c;第一个是修改作者信息&#xff0c;第二个是修改日志信息 二、svn修改提交的日期信息 修改日期信息的话&#xff0c;你得先有svn服务器的权限&…

光电接收的TIA设计

APD的光电接收电路如下图所示&#xff0c;APD的光电流较SiPM是小很多的&#xff0c;所以需要TIA来做跨阻放大&#xff0c;一般RF电阻要5k到10k左右&#xff0c;光电流一般也就几十uA&#xff0c;这个跨阻放大主要是对Cf大小的选择&#xff0c;Cf的选择主要考虑下面的两点。从放…

【基础强训】day4

一、选择题 &#x1f308;第1题 有以下程序 #include<iostream> #include<cstdio> using namespace std; int main(){ int m0123, n123; printf("%o %o\n", m, n); return 0; } 程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 01…

汇聚数据库创新力量,加速企业数字化转型

2022年12月29日&#xff0c;以“汇聚数据库创新力量&#xff0c;加速企业数字化转型”为主题的openGauss Summit 2022在线上举行。会上&#xff0c;openGauss社区理事会理事长江大勇对外公布了最近社区及生态进展&#xff0c;并宣布推出资源池化架构&#xff0c;实现软硬融合&a…

人脸识别实战教程

人脸识别实战教程 本教程介绍如何使用Alibaba Cloud SDK for Java进行人体属性识别、人体计数和人脸搜索任务。 背景信息 人脸人体识别技术是基于阿里云深度学习算法&#xff0c;结合图像或视频的人脸检测、分析、比对以及人体检测等技术&#xff0c;为您提供人脸人体的检测…

【Java语言】— 运算符、案例:键盘录入

目录运算符1.算术运算符案例&#xff1a;数值拆分2.“”做连接符3.自增自减运算符自增自减的使用事项自增自减的案列4.赋值运算符基本赋值运算符&#xff1a;“”扩展赋值运算符&#xff1a;“”、“-”、“*”、“/”5.关系运算符6.逻辑运算符短路逻辑运算符总结7.三元运算符三…

DAS和NAS

对于有大量数据存储需求的人群可能都听过NAS或者DAS&#xff0c;由两者演化出来的产品也各有不同&#xff0c;但是两者的真正的区别是什么、各有哪些优势和劣势、分别适用哪些人群一直以来也是困扰大家的问题。 DAS全称为直接附加存储(Direct Attached Storage&#xff0c;DAS…