函数(递归)

递归:程序调用自身编程技巧称为递归。

       在学习递归前需要粗略的了解一下内存,内存分为三类,分别是栈区、堆区和静态区。对于栈区来说,每调用一次函数都会为本次函数开辟一块空间,然而栈区也是有空间限制的,随即函数调用存在限制条件(当满足这个限制条件是递归便不再继续),且每次递归调用后越来越接近这个限制条件。超过这个限制会出现栈溢出的现象。

现在写一个简单的代码看一下栈溢出会出现怎么样的现象。

int main()
{printf("NX\n");main();return 0;
}

递归题目类型(既可以用递归也可以用非递归(简称迭代))

        1.打印一个数字的每一位且按照顺序。例:1024->1 0 2 4 ;

递归法

       递归是由里往外,先执行最里层的函数,函数执行完再逐渐返回调用的函数直至函数全部执行完返回到主函数里。这个题目就是不断地取余取模,一直重复这两个操作。它可以通过抹去尾位不断调用函数直至打印最高位,下面这个图演示了调用函数的过程:

 代码实现:

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

 迭代法

       这个方法需要抹去最高位数并打印出来,在这之前需要知道这个数的位数。接着对这个数进行相同位数取模、打印,取余减小位数为了打印下一位数字,这个相同位数在打印中不断变化(减小一位),然后就是重复之前的操作。

       举一次例子:通过计算得到1024是一个四位的数字,然后计算出就是相同位数1000,先取模1024/1000并打印数字1,最高位就打印好了,其次就是取余1024%1000=24将其值赋值给n,相同位数随即也要减小一位1000/10;然后就是while循环重复。

代码实现: 

int digit(int n)
{int count = 0;while (n){n = n / 10;count++;}return count;
}int main()
{int n = 0;scanf("%d", &n);int i = 0;int count = 0;int ret = 1;count = digit(n);//调用函数的原因是不改变n的值(利用形参不改变实参的值)for (i = 1; i < count; i++){ret = ret * 10;//计算相同位数}while (n){printf("%d ", n / ret);n = n % ret;//取余ret = ret / 10;//为了相同位数取模}return 0;
}
       2.实现n的k次方。例:2 3->8;

递归法

       限制条件是(k>0)满足调用函数,不满足返回1。下图展示:

代码实现: 

int factorial(int n, int k)
{if (k > 0){return n * factorial(n, k - 1);}else{return 1;}
}int main()
{int n = 0;int k = 0;scanf("%d %d", &n, &k);int sum = factorial(n, k);printf("%d\n", sum);return 0;
}

迭代法

       通过循环相乘有点类似累乘,代码也更少一点。代码实现:

int main()
{int n = 0;int k = 0;int i = 0;int num = 1;scanf("%d %d", &n, &k);for (i = 1; i <= k; i++){num = num * n;//n的k次方}printf("%d\n", num);return 0;
}
       3.斐波那契数。例:1,1,2,3,5,8,13,......

递归法

       限制条件(n<3)。满足返回1,不满足调用函数直至返回一个数字。下面是第五个斐波那契数需要调用的斐波那契数,仔细看会发现有一些斐波那契数重复计算或调用(3,2,1),这大大增加计算的时间,假设需要计算一个很大很大的斐波那契数那重复计算的次数会更多,所以有时候并不是代码越简单越好,或任何场景使用递归都不是明智之举,需要具体问题具体分析。

代码实现: 

int fibonacci(int n)
{if (n < 3)return 1;elsereturn fibonacci(n - 1) + fibonacci(n - 2);
}int main()
{int n = 0;scanf("%d", &n);int ret = fibonacci(n);printf("%d\n", ret);return 0;
}

迭代法 

 简单明了的表明意图,循环直接算斐波那契前两项,通过不断复制避免重复计算。代码演示:

int main()
{int n = 0;int i = 0;int a = 1;int b = 1;long long c = 1;//考虑斐波那契数会是一个巨大的数scanf("%d", &n);while (n > 2){c = a + b;a = b;b = c;n--;//循环条件}printf("%d\n", c);return 0;
}

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

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

相关文章

Golang | Leetcode Golang题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; func isAnagram(s, t string) bool {if len(s) ! len(t) {return false}cnt : map[rune]int{}for _, ch : range s {cnt[ch]}for _, ch : range t {cnt[ch]--if cnt[ch] < 0 {return false}}return true }

Temporal-Kit 及 Ebsynth-流程

https://www.youtube.com/watch?vBL77HVIviJM 预处理 Ebsynth-流程

全国区块链职业技能大赛第八套区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 医疗健康平台中涉及到医院、医生、患者等参与方,他们需要在区块链医疗健康平台中完成账户注册、身份上链、挂号就诊、查询病例等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于医疗健康平台系统架构,以…

PyTorch实战:深度解析Tensor归一化技巧与应用

PyTorch Tensor 归一化&#xff1a;理解、应用及实现 在机器学习和深度学习中&#xff0c;数据预处理是一个关键的步骤。其中&#xff0c;对于某些情况下&#xff0c;特别是生产的环境&#xff0c;数据归一化是一项必不可少的任务。 在 PyTorch 中&#xff0c;对于 Tensor 的…

【SpringBoot配置文件application.yaml】笔记

详细内容见官方文档Common Application Properties 使用application.yaml进行简单配置 第一步&#xff1a;创建WebDemo第二步&#xff1a;创建application.yaml配置文件注意&#xff1a; 第三步&#xff1a;验证自己创建的yaml文件是否生效测试&#xff1a;思考&#xff1a;如…

算法刷题笔记 八数码(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 在一个33的网格中&#xff0c;1∼8这8个数字和一个x恰好不重不漏地分布在这33的网格中。例如&#xff1a; 1 2 3 x 4 6 7 5 8 在游戏过程中&#xff0c;可以把x与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&…

MT7628指定分区备份固件

为了避免升级过程突然断电&#xff0c;或者其他不良操作导致的路由器“变砖”。在MT7628使用过程中&#xff0c;我们可以对固件进行备份。 MT7628原厂SDK有关于双备份的选项&#xff0c;选择对应选项后&#xff0c;可对固件进行备份。下面以SKYLAB的SKW92A模组为例进行测试说明…

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。 面试职位: 网盘主端研发组_Android高级研…

细说MCU用定时器控制单路DAC模块设计和输出锯齿波的实现方法

目录 一、参考工程 二、仅提供不同的配置 1、用定时器控制DAC输出 2、配置定时器参数 三、代码修改 四、 运行并观察显示效果 一、参考工程 本工程依赖作者的文章&#xff1a;细说MCU用单路DAC模块设计和输出锯齿波的实现方法-CSDN博客 https://wenchm.blog.csdn.net/ar…

Python 如何对上万、百万、亿级数据去重?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 今天我们要一起探索一个让数据工程师、数据科学家和开发者们都头疼的问题&#xff1a;如何对海量数据进行去重。随着数据量的不断增长&#xff0c;我们在处理数据时&#xff0c;去重操作…

要么利用规则,要么打破规则

在这个充满规则和标准的世界里&#xff0c;我们常常被告知要如何生活、如何成功。但事实上&#xff0c;这些规则和标准往往限制了我们的潜力和创造力。本文将探讨如何不被外界规则所束缚&#xff0c;活出自己的风采。 规则的双刃剑 规则和标准可以为社会带来秩序&#xff0c;…

JavaScript进阶之构造函数数据常用函数

目录 一、深入对象1.1 创建对象的三种方式1.2 构造函数1.3 实例成员&静态成员 二、内置构造函数2.1 Object2.2 Array2.3 String常见实例方法2.4 Number 一、深入对象 1.1 创建对象的三种方式 利用对象字面量创建对象利用new object创建对象 const obj new Object({})利用…

SAP 如何修改统驭科目类型

在SAP中&#xff0c;科目设置错了统驭科目类型并且记账了要如何修改&#xff1f; 例如&#xff1a;前期应收账款对应的统驭科目类型前期设置成了供应商&#xff0c;并且供应商用该科目过来账&#xff0c;现在需要调整&#xff0c;想要将供应商调整到客户&#xff0c;科目为当前…

Java | Leetcode Java题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution {public int missingNumber(int[] nums) {int n nums.length;int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} }

ros2--QOS--通信质量

在ros2通信编程中&#xff0c;总有一个和qos相关的参数&#xff1a; publisher: template<typename MessageT, typename AllocatorT, typename PublisherT> std::shared_ptr<PublisherT> Node::create_publisher(const std::string & topic_name,const rclcp…

Linux安装Redis5.0镜像、Mysql8.0镜像

docker 安装Redis &#xff08;全网最详细&#xff1a;附带配置文件&#xff09;_docker pull redis-CSDN博客 Docker实用-安装Mysql8 - 简书 改动&#xff1a; 指定&#xff1a;docker pull mysql:8.0 docker run -d -p 3306:3306 \ --restartalways \ --privilegedtrue \…

088、Python 读取Excel文件及一些操作(使用xlwtxlrd库)

要读取Excel文件&#xff0c;我们需要使用第三方库。 xlrd库是一个常用的读取Excel的第三方库&#xff0c;它同时支持.xls和.xlsx&#xff0c;不过xlrd从版本2.0.0开始不再支持.xlsx的读取&#xff0c;需要单独使用openpyxl。 要使用第三方库&#xff0c;首选需安装&#xff…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…