函数递归练习
目录
1.分析下面选择题
2.实现求第n个斐波那契数
3.编写一个函数实现n的k次方,使用递归实现。
4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
5.递归方式实现打印一个整数的每一位
6.实现求n的阶乘
1.分析下面选择题
根据下面递归函数:调用函数Fun(2),返回值是多少 (16)
int Fun(int n)
{ if(n==5) return 2; else return 2*Fun(n+1);
}
解析:当n==5的时候退出递归 先递推,再回归 n=2的时候 一直递推 到2*fun(5) 的时候结束递推(一共三次递推),然后回归(也三次) ==> 4个2相乘 =16
2.实现求第n个斐波那契数
我们要先理解什么叫斐波那契数,简单解释一下吧
1 , 1 , 2 , 3 , 5.... 那就是前两个数相加等于第三个数,例如1+1=2 1+2=3 ....
-
递归实现
假如用递归实现,要确定限制条件,那就是第一个数和第二数的时候都是返回1
Fib(1)=1,Fib(2)=1 因此我们设定条件n=1和n=2时返回1(限制条件)
而当n>=2是返回Fib (n-1)+Fib(n-2)实现递归(趋近于限制条件)
-
递归函数的缺点: 其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。计算就会很慢
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 ret = Fib(n);printf("%d", ret);
}
-
迭代方式实现
-
在函数体内部,定义了三个整型变量
a、b和c,分别用于保存斐波那契数列中的相邻三个数。 -
在循环体内,
c = a + b;表示将变量c赋值为a和b的和,即斐波那契数列中的下一个数。 -
接着更新
a和b的值,将a更新为原来的b,将b更新为原来的c,以便下一次迭代计算。
int Fib(int n) {int a = 1;int b = 1;int c = 1;while (n>2){c = a + b; //a = b;b = c;n--;//减到<=2的时候退出循环}return c;
}
int main() {int n = 0;scanf("%d", &n);int r = Fib(n);printf("%d\n", r);return 0;
}
3.编写一个函数实现n的k次方,使用递归实现。
-
思考一下,什么是限制条件?
-
当指数k一直减减减到为0的时候,那么结果返回1,结束递归
-
power(n, k - 1): 这部分是递归调用,它会计算n的k - 1次方。这就是递归的关键,它通过反复调用自身来逐步减小问题的规模。 -
n * power(n, k - 1): 这里将n与n的k - 1次方相乘,从而得到n的k次方。因为n的k次方可以表示为n乘以n的k - 1次方。
#include <stdio.h>
// 递归函数计算n的k次方
double power(double n, int k) {// 递归基if (k == 0)return 1;// 若k为负数,则返回1除以n的-k次方if (k < 0)return 1 / power(n, -k);// 递归计算n的k次方return n * power(n, k - 1);
}
int main() {double n;int k;printf("请输入底数n和指数k:");scanf("%lf%d", &n, &k);double result = power(n, k);printf("%.2lf的%d次方为%.2lf\n", n, k, result);return 0;
}
4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
int DigitSum(int n)
{if (n < 10)return n;else{int sum = n % 10 + DigitSum(n / 10);return sum;}
}
int main()
{int n = 0;scanf("%d", &n);printf("%d", DigitSum(n));return 0;
}
5.递归方式实现打印一个整数的每一位
-
分析:用递归的方法 我们将 1234 按顺序输出 1 2 3 4
我们可以定义一个Print()函数
先递推:(一直递推到最高位,然后再从最高位开始打印,就会按顺序输出)
(1234) 除以十去掉最后一位 (123) 4
(123) 4 ---> (12) 3 4 ----> (1)2 3 4 ---> 1 2 3 4
每次都调用自己,直到不能再分(限制条件)
后回归:
-
最后当n=1的时候不满足n>9的条件,达到限制条件然后进行回归,
1%10 = 1
12%10=2
123%10 =3
然后再顺序输出1 2 3

int Print(int n) {if (n > 9)//当n是两位数以上{Print(n / 10);}printf("%d ", n % 10);
}
int main() {int n = 0;scanf("%d", &n);Print(n);
}
6.实现求n的阶乘
递归和非递归分别实现(不考虑溢出的问题)
-
递归的方法
-
当n=0的时候 阶层为1 ==>限制条件
-
不等于0的时候就算阶层
//递归方式
int Fact(int n) {if (0 == n) {return 1;}else{return n * Fact(n - 1);}
}
int main() {int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);return 0;
}
-
非递归方法
int Fact(int n) {int sum = 1;int i = 0;for (i = 1; i <= n; i++) {sum *= i;}return sum;}
int main() {int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);return 0;
}
相关文章:
函数递归练习
目录 1.分析下面选择题 2.实现求第n个斐波那契数 3.编写一个函数实现n的k次方,使用递归实现。 4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和 5.递归方式实现打印一个整数的每一位 6.实现求n的阶乘 1.分析下面选择…...
公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)
目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口(可选) 3. 打开Wireshark抓包工具4. 新开终端,进行连接5. 查看抓包文件,验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…...
【Day3:JAVA运算符、方法的介绍】
目录 1、运算符1.1 赋值运算符1.2 比较运算符1.3 逻辑运算符1.3.1 逻辑运算符概述1.3.2 逻辑运算符分类1.3.3 短路的逻辑运算符 1.4 三元运算符1.5 运算符优先级 2、方法2.1 方法介绍2.2 方法的定义和调用格式2.2.1 方法的调用2.2.2 带参数方法的调用2.2.3 带返回值方法的调用2…...
Chrome查看User Agent的实战教程
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Linux 第三十四章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...
国际化日期(inti)
我们可以使用国际化API自动的格式化数字或者日期,并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的,非常的简单; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…...
【论文阅读笔记】jTrans(ISSTA 22)
个人博客地址 [ISSTA 22] jTrans(个人阅读笔记) 论文:《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库:https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测(BCSD࿰…...
单位个人如何向期刊投稿发表文章?
在单位担任信息宣传员一职以来,我深感肩上的责任重大。每月的对外信息宣传投稿不仅是工作的核心,更是衡量我们部门成效的重要指标。起初,我满腔热血,以为只要勤勉努力,将精心撰写的稿件投至各大报社、报纸期刊的官方邮箱,就能顺利登上版面,赢得读者的青睐。然而,现实远比理想骨…...
Redis数据结构-RedisObject
1.7 Redis数据结构-RedisObject Redis中的任意数据类型的键和值都会被封装为一个RedisObject,也叫做Redis对象,源码如下: 1、什么是redisObject: 从Redis的使用者的角度来看,⼀个Redis节点包含多个databaseÿ…...
Vue 中使用 el-date-picker 限制只能选择当天、当天之前或当天之后日期的方法详解
网上很多都是不完整的,我这里发布一个完整的 - 8.64e7 表示可选择当天时间(注:小于当前时间,- 8.64e7 则是禁用日期不包含当前日,若大于当前日期, 8.64e7 则是禁用日期包含当前日) time.getTi…...
系列介绍:《创意代码:Processing艺术编程之旅》
系列介绍:《创意代码:Processing艺术编程之旅》 标题创意: “代码绘梦:Processing艺术编程入门”“数字画布:用Processing创造视觉奇迹”“编程美学:Processing艺术创作指南”“创意编程:Proc…...
深度学习设计模式之抽象工厂模式
文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习抽象工厂模式,抽象工厂模式创建的是对象家族,比如:苹果是一个产品,但是他不单单只生产手机,还…...
K8s是什么?
url address K8s是一个开源的容器编排平台,可以自动化,在部署,管理和扩展容器化应用过程中涉及的许多手动操作。 Kubernetes最初是由Google工程师作为Borg项目开发和设计的,后于2015年捐赠给云原生计算基金会(CNCF&a…...
【网站项目】SpringBoot796水产养殖系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
Vue详细介绍
Vue.js(通常简称为Vue)是一个用于构建用户界面的渐进式JavaScript框架。它由尤雨溪(Evan You)创建,并于2014年首次发布。Vue的设计目的是易于上手,同时也能够强大到驱动复杂的单页应用(SPA&…...
声纹识别的对抗与防御
随着机器学习理论和方法的发展, 出现了用于模仿特定说话人语音的深度伪造、针对语音识别和声纹识别的对抗样本, 它们都为破坏语音载体的可信性和安全性提供了具体手段, 进而对各自应用场景的信息安全构成了挑战。 深度伪造是利用生成式对抗网络等方法, 通过构建特定的模型, 产生…...
C++ QT设计模式总结
Ciallo~(∠・ω< )⌒★,这里是 Eureka,欢迎来看我的设计模式总结,有问题随时可以告诉我~ 面向对象的设计模式: 以下总结了面向对象的设计模式, QT 的源码在哪里体现了这些模式,以及如何在 …...
洛谷 P3203:弹飞绵羊 ← 分块算法(单点更新、单点查询)
【题目来源】https://www.acwing.com/problem/content/2168/https://www.luogu.com.cn/problem/P3203【题目描述】 某天,Lostmonkey 发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。 游戏一开始,L…...
程序验证之Dafny--证明霍尔逻辑的半自动化利器
一、What is Dafny?【来自官网介绍 Dafny 】 1)介绍 Dafny 是一种支持验证的编程语言,配备了一个静态程序验证器。 通过将复杂的自动推理与熟悉的编程习语和工具相结合,使开发者能够编写可证明正确的代码(相对于 {P}S{Q} 这种…...
Flutter 中的 SafeArea 小部件:全面指南
Flutter 中的 SafeArea 小部件:全面指南 在移动应用开发中,处理设备屏幕的边缘是一个常见的挑战,尤其是考虑到现代设备通常具有不同的屏幕形状,如刘海屏、曲面屏等。为了确保应用内容不会覆盖这些屏幕区域,Flutter 提…...
绝大多数主流中间件、框架,底层都是靠反射做能力扩展、插件化、自定义适配
完全没错,绝大多数主流中间件、框架,底层都是靠反射做能力扩展、插件化、自定义适配框架本身只写通用骨架,把扩展口子留给反射,让业务 / 第三方自己填逻辑。一、核心逻辑框架定死主干流程,不写死具体业务类、实现类预留…...
从游戏显卡到专业GIS:如何为你的SuperMap三维场景挑选并调校一张合适的显卡
从游戏显卡到专业GIS:如何为你的SuperMap三维场景挑选并调校一张合适的显卡 在数字孪生和智慧城市建设的浪潮中,三维GIS平台正成为空间数据分析的核心工具。SuperMap作为国产GIS软件的领军者,其三维模块对硬件性能的需求常常让技术决策者陷入…...
B站视频转文字终极方案:3分钟学会一键智能提取视频内容
B站视频转文字终极方案:3分钟学会一键智能提取视频内容 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而烦恼吗࿱…...
基于加速度计的体感音乐控制器:用MakeCode与Circuit Playground Express实现交互式乐器
1. 项目概述:当硬件编程遇见音乐创作 如果你对嵌入式开发、物理计算或者音乐技术感兴趣,但又觉得从零开始门槛太高,那么这个项目可能就是为你量身定做的。今天我们来聊聊如何用一块巴掌大的开发板——Adafruit的Circuit Playground Express&a…...
硬件工程师避坑指南:从原理到实战,搞定ESD防护设计与IEC 61000-4-2测试
硬件工程师避坑指南:从原理到实战,搞定ESD防护设计与IEC 61000-4-2测试 在北方干燥的冬季,脱下毛衣时噼啪作响的静电火花或许只是生活中的小插曲,但对于价值数百万的医疗设备或自动驾驶系统而言,同样的静电放电&#x…...
基于GIS流域水文分析及水库库容计算实践技术
1、GIS水文分析的原理、DEM数据的获取与处理2、基于水文分析的流域边界、河道及分子流域提取3、暴雨情景下流域淹没区快速识别4、基于GIS的水库库容计算...
EFFACT架构:全同态加密硬件加速的创新设计
1. EFFACT架构概述:当硬件设计遇上全同态加密在密码学加速器的世界里,我们一直在寻找一个平衡点——如何在有限的芯片面积和功耗预算下,处理那些看似无解的复杂计算?EFFACT架构的诞生,正是为了解决全同态加密ÿ…...
构建智能家居自动化桥梁:基于Webhook与事件驱动的跨平台集成实战
1. 项目概述与核心价值最近在折腾智能家居和自动化流程,发现很多朋友都卡在了一个看似简单却非常关键的环节上:如何让不同的智能设备或软件服务之间“说上话”。比如,你希望家里的智能音箱在收到指令后,不仅能控制灯光,…...
iPXE脚本编程实战:自动化部署、故障诊断和定制化菜单终极指南
iPXE脚本编程实战:自动化部署、故障诊断和定制化菜单终极指南 【免费下载链接】ipxe iPXE network bootloader 项目地址: https://gitcode.com/gh_mirrors/ip/ipxe iPXE作为领先的开源网络启动引导程序,提供了强大的脚本编程功能,让网…...
Equalizer APO:Windows系统音频均衡终极指南,免费打造专业级音效体验
Equalizer APO:Windows系统音频均衡终极指南,免费打造专业级音效体验 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 想要彻底提升Windows电脑的音频质量吗?Equalize…...
