函数递归练习

news2024/11/23 11:55:47

目录

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);
}
  • 迭代方式实现

  1. 在函数体内部,定义了三个整型变量 abc,分别用于保存斐波那契数列中的相邻三个数。

  2. 在循环体内,c = a + b; 表示将变量 c 赋值为 ab 的和,即斐波那契数列中的下一个数。

  3. 接着更新 ab 的值,将 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): 这部分是递归调用,它会计算 nk - 1 次方。这就是递归的关键,它通过反复调用自身来逐步减小问题的规模。

  • n * power(n, k - 1): 这里将 nnk - 1 次方相乘,从而得到 nk 次方。因为 nk 次方可以表示为 n 乘以 nk - 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;
}

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

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

相关文章

linux Docker在线/离线服务安装并支持centos7和centos8系统

注&#xff1a;以下内容都是经过测试;能在生产环境使用. 一、centos7版本的docker在线安装 1&#xff1a;运行以下命令&#xff0c;下载docker-ce的yum源。 sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

外卖系统拦截器实现(Interceptor)

SpringMVC的拦截器主要是用于拦截控制器方法的执行&#xff1b; 概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。在Spring中动态拦截控制器中方法的执行。 作用&#xff1a;在指定的控制器中调用前后执行预先设定的代码&#xff0c;完成功能增强。 应…

人才测评:计划管理能力与岗位胜任力素质测评

计划管理能力指的是什么&#xff1f; 计划管理能力&#xff0c;可以体现为从业者在精准制定好任务&#xff0c;或是根据任务的时间长&#xff0c;困难的程度来设定好完成的目标&#xff0c;一步一个脚印将工作完成好&#xff0c;并且能预估出可能出现的突发事件&#xff0c;将…

STM32--HC-SR501 热释电人体红外感应模块

实物引脚图&#xff1a; 模块工作特性&#xff1a; 当人进入感应范围之后输出引脚输出高电平&#xff0c;人离开感应范围自动延时输出低电平 热释电效应&#xff1a; 热释电传感器&#xff0c;也称为人体红外传感器&#xff0c;其工作原理基于热释电效应。这种传感器由几个关…

2024护网在即,今年的护网招聘着实有点离谱了!

最近刷到条护网招聘的朋友圈&#xff0c;今年的护网待遇着实有点离谱了&#xff0c;日薪提到了1w&#xff0c;还是全款垫付&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01; 我算是理解了“我们当年可没你现在这个条件”这句话。 先给大家科普下护网行动&#x…

【C语言】6.C语言VS实用调试技巧(2)

文章目录 6.调试举例17.调试举例28.调试举例3&#xff1a;数组9.编程常⻅错误归类9.1 编译型错误9.2 链接型错误9.3 运⾏时错误 – 6.调试举例1 求 1!2!3!4!…10! 的和。 int main() {int n 0;int i 0;int ret 1;int sum 0;for (n 1; n < 3; n) {for (i 1; i < …

数据结构之栈与队列

一.栈 1.定义&#xff1a;一种线性表&#xff0c;只允许在固定的一端进行删除和插入数据的操作&#xff0c;该端叫栈底&#xff0c;另一端叫栈顶 2.特点&#xff1a;先进后出 注&#xff1a;栈中元素出栈是一对多的(他虽然满足先进后出但是我们可以在pop数据前先获取栈顶元素…

Tower for Mac:Git管理的新境界

Tower for Mac&#xff0c;让您的Git管理进入新境界&#xff01;这款专为Mac用户打造的Git客户端&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;成为众多开发者的首选工具。 Tower不仅支持常规的Git操作&#xff0c;如提交、推送和拉取&#xff0c;还提供了许多高级功能…

【微服务最全详解】

文章目录 微服务微服务的介绍微服务服务架构演变 微服务网关微服务的负载均衡微服务的容灾机制服务崩溃服务容灾机制微服务熔断机制微服务限流Sentinel怎么实现限流微服务限流算法1.令牌桶算法2.漏斗桶算法 服务监控日志收集 微服务 微服务的介绍 微服务是一种软件架构风格&a…

MyBatis的创建和测试

创建项目点击Spring Initializr然后点击next 点击SQL 选择里面的Mybatis Framework和Mysql Driver 按如下图片创建项目 user表中的数据 #下面这些内容是为了让MyBatis映射 #指定Mybatis的Mapper文件 mybatis.mapper-locationsclasspath:mappers/*xml #指定Mybatis的实体目录 my…

使用人人开源renren-fast快捷搭建后台管理系统

https://gitee.com/renrenio/renren-fast https://gitee.com/renrenio/renren-fast 初始化项目数据库 导入项目运行 期间遇到的坑 024-04-25 01:30:27.638 ERROR 25228 --- [ main] com.alibaba.druid.pool.DruidDataSource : init datasource error, url: jdbc:…

【安全每日一讲】API是什么?解密API背后的奥秘

什么是API? API全称Application Programming Interface&#xff0c;即应用程序编程接口&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定&#xff0c;用于传输数据和指令&#xff0c;使应用程序之间可以集成和共享数据资源。 简单来说&#…

thinkphp8 framework和 element plus admin前后端分离系统之PHP安装教程

DIYGW-UI-PHP是一款基于thinkphp8 framework和 element plus admin开发而成的前后端分离系统。目的是结合现有diygw-ui打造一个后台API开发。 实现PHP源码前请先下载小皮面板或者宝塔。 系统已经集成了部分功能 用户管理 后台用户管理部门管理 配置公司的部门结构&#xff0…

用红黑树封装出map与set

目录 一、红黑树的改造 节点结构的定义 迭代器类的实现 红黑树中提供迭代器 红黑树的主要代码 二、set的实现 三、map的实现 四、测试代码 map与set的底层都是红黑树&#xff0c;所以本篇文章就分享如何用同一颗红黑树封装出map与set 所以大家可以先去看一下我的讲解红…

先有JVM还是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢&#xff0c;还是先有JVM再有垃圾回收器呢&#xff1f;或者是先有垃圾回收再有JVM呢&#xff1f;历史上还真是垃圾回收更早面世&#xff0c;垃圾回收最早起源于1960年诞生的LISP语言&#xff0c;Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

ue引擎游戏开发笔记(38)——实现敌人接收攻击伤害,并作出反应

1.需求分析&#xff1a; 现在已经显示造成实际伤害&#xff0c;但敌人对实际伤害并未产生反馈&#xff0c;例如还击&#xff0c;或者死亡倒地等等&#xff0c;实现敌人对于受击的反馈。 2.操作实现&#xff1a; 1.思路&#xff1a;在动画蓝图中添加死亡动画&#xff0c;并通过…

wefaf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

Python 渗透测试:反弹 shell (反弹 后门 || 程序免杀)

什么叫 反弹 shell 反弹 shell (Reverse Shell) 是一种常见的渗透测试技术,它指的是受害者主机主动连接攻击者的主机,从而让攻击者获得对受害者主机的控制权。在一个典型的反弹 shell 攻击中,攻击者会在自己的主机上监听一个特定的端口,然后诱使目标主机主动连接到这个端口。当…

Cadence 16.6 绘制PCB封装时总是卡死的解决方法

Cadence 16.6 绘制PCB封装时总是卡死的解决方法 在用Cadence 16.6 PCB Editor绘制PCB封装时候&#xff0c;绘制一步卡死一步&#xff0c;不知道怎么回事儿&#xff0c;在咨询公司IT后&#xff0c;发现是WIN系统自带输入法的某些热键与PCB Editor有冲突&#xff0c;导致卡死。 …

网络地址转换(nat,easy ip,nat server)资源上传

实验概述 由内到外 nat&#xff0c;easy ip&#xff0c;转换的是源ip nat server 由外到内&#xff0c;转换的是目的IP 实验拓扑 结果验证 nat实验得到结果 1.ar1到ar3没有路由也可以访问 2.ar3配置telent后ar1也可以通过telnet远程配置 esay ip 如果ar2 g0/0/1接口ip非固…