函数递归(上)

news2024/9/21 3:35:24

目录

1.递归是什么?

1.1 递归的思想:

2.顺序打印⼀个整数的每⼀位

​编辑3 迭代

4.求第n个斐波那契数


1.递归是什么?

递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰

#include <stdio.h>
int main()
{
    printf("哈哈\n");
    main();//自己调用自己,结果就是死循环打印哈哈

    return 0;
}

1.1 递归的思想:

所以递归的思考⽅式就是把⼤事化⼩的过程。 递归中的递就是递推的意思,归就是回归的意思,接下来慢慢来体会。

计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。

#include <stdio.h>
 int  func(int n)
{
     if (n == 0)//1的阶乘是0;
         return 1;
     else
         return n * func(n - 1);//套用公式
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ", r);
    return 0;
}

上面图很好的解释了上面代码

 在C语⾔中每⼀次函数调⽤,都需要为本次函数调⽤在内存的栈区,申请⼀块内存空间来保存函数调 ⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。

2.顺序打印⼀个整数的每⼀位

输⼊:1234 输出:1 2 3 4

输⼊:520 输出:5 2 0

这个题⽬,放在我们⾯前,⾸先想到的是,怎么得到这个数的每⼀位呢? 如果n是⼀位数,n的每⼀位就是n⾃⼰ n是超过1位数的话,就得拆分每⼀位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 /10 操作,直到1234的每⼀位都得到;

#include <stdio.h>
void  Print(int n)
{
    if (n > 9)
        Print(n /10);
    printf("%d ", n % 10);//调用完后才打印
  }
int main()
{
    int n = 0;
    scanf("%d", &n);
    Print(n);   
    return 0;
}

3 迭代

#include <stdio.h>
int func(int n)//用迭代的方法写出n的阶乘
{
    int i = 0;
    int ret = 1;
    for (i = 1; i <= n; i++)
    {
        ret *= i;  
    }
    return ret;
}

int  main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ", r);
    return 0;
}

4.求第n个斐波那契数

看到这公式,很容易诱导我们将代码写成递归的形式

#include <stdio.h>
int func(int n)
{
    if (n <= 2)
        return 1;
    else
        return func(n - 1) + func(n - 2);//这个代码计算比较小的数值还可以,但是到了五十的斐波那契就显得困难了
 }
int main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ",r);
    return 0;
}

 当算到第50个斐波那契数列就显得非常吃力了,那是由于什么原因呢?下面来看一张图就能帮助你理解。

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

 用迭代的方式来写

#include <stdio.h>
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;
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int r = Fib(n);
    printf("%d ", r);
    return 0;
}

迭代的⽅式去实现这个代码,效率就要⾼出很多了

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

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

相关文章

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之扬帆移植案例

标准系统方案之扬帆移植案例 ​ 本文章是基于瑞芯微RK3399芯片的yangfan开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c;WIFI&a…

高效财税自动化软件如何提升企业财务工作的效率与准确性

在当今企业运营中&#xff0c;财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策&#xff0c;还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战&#xff0c;财务管理亟需进行持续的转型与提升&#xff0c;为企业高质量发展目标的实现…

vue2.0+ts注册全局函数和几个递归查找

vue2.0ts注册全局函数和几个递归查找 一、main.ts 一、main.ts // 定义你的全局函数,判断是否有按钮权限 interface Item {label: string;checked: number;[k: string]: any; } // 获取按钮时候权限 function globalLable(arr: Item[], label: string): boolean {for (const i…

为大模型提供服务需要多少 GPU 显存?

在几乎所有的 LLM 面试中&#xff0c;有一个问题总是会被提及&#xff1a;“为大模型提供服务需要多少 GPU 显存&#xff1f;” 这不仅仅是一个随机的问题——它是一个关键指标&#xff0c;反映了你对这些强大模型在生产环境中部署和可扩展性的理解程度。 当你使用 GPT、LLaM…

在QSciscintilla编辑器源码中新增关键词分组的方法

由于项目需要&#xff0c;得在QSciscintilla的底层源码中增加几组关键词分组。在网上找了很久&#xff0c;一般都是说利用重写keywords(int set)接口的方式来增加&#xff0c;但这种方法不适用于我的应用场景。因为这种方法只能增加有限个关键词&#xff0c;且都是直接写死的方…

风电出海内幕:黄金期和内卷期共存

间歇性停战&#xff0c;持续性内卷&#xff0c;这就是中国风电。 9月4日&#xff0c;中国可再生能源学会风能专业委员会秘书长秦海岩发布文章《穿越周期&#xff0c;跨过险阻&#xff0c;中国风电的征途仍是星辰大海》。文章指出&#xff0c;中国风电行业正在重现十多年前的恶…

高中数学:立体几何-空间中点、直线、平面之间的位置关系

文章目录 1、空间中直线与直线的位置关系1、平行线传递性质2、定理3、空间直线夹角 2、空间中直线与平面的位置关系1、线面平行2、线面垂直 3、空间中平面与平面的位置关系1、面面平行2、二面角&#xff08;面与面的夹角&#xff09;3、面面垂直 4、补充 1、空间中直线与直线的…

新手也能快速上手!推荐这四款剪辑软件

在数字媒体日益盛行的今天&#xff0c;视频剪辑软件几乎成为了每一位视频创作者或媒体工作者必备的“十八般武艺”之一&#xff1b;用各种软件对影片、音乐进行精确到秒的剪切和调色&#xff0c;让我深刻体验到其功能的强大与方便&#xff0c;下面就为大家分享一下我在工作中常…

制造企业MES系统委外工单管理探析

一、委外工单管理的重要性 在制造企业的生产过程中&#xff0c;委外工单管理是一项重要且复杂的任务。委外加工是指企业将某些生产任务外包给外部供应商完成&#xff0c;以降低成本、提高效率或满足特定需求。然而&#xff0c;委外加工过程中往往存在诸多不确定性&#xff0c;…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

C++(Qt)软件调试---断点高级用法(20)

C(Qt)软件调试—断点高级用法&#xff08;20&#xff09; 文章目录 C(Qt)软件调试---断点高级用法&#xff08;20&#xff09;[toc]1、概述2、断点高级用法1.1 条件断点1.2 日志断点/记录点/消息追踪点1.3 函数断点1.4 命中次数断点1.5 异常断点1.6 等待断点/触发断点1.7 临时断…

一台 Linux 同时 安装配置多个 python3 环境( 3.7 - 3.12 )

很多粉丝来信说&#xff1a;安装新 python3 环境&#xff0c;要卸载操作系统原来自带的 python。。。 博主再次声明&#xff1a;不需用搞复杂了&#xff0c;相反可以同时具备多个环境&#xff0c;也不需用配置环境变量 无图无真相&#xff0c;且看此图&#xff1a; 详情操作&am…

Android IME输入法启动显示隐藏流程梳理

阅读Android AOSP 12版本代码&#xff0c;对输入法IME整体框架模块进行学习梳理&#xff0c;内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程&#xff0c;以及常见问题和调试技巧。 1. IME整体框架​​​​​​​ IME整体分为三个部分&#xf…

python怎么打开文件对话框

可以使用tkinter.filedialog模块中的askopenfilename函数来实现&#xff0c;tkinter是python自带的GUI&#xff0c;通过askopenfilename函数打开选择文件对话框&#xff0c;代码如下&#xff1a; import tkinter.filedialog fntkinter.filedialog.askopenfilename(title选择一个…

HT366 具有防破音功能的免电感滤波2x20W D类立体声音频功放

特点 输出功率(BTL模式) 2x22W (VDD14V,RL4Ω,THDN10%) 输出功率(PBTL模式) 34W(VDD16V,RL4Ω,THDN10%) 单电源系统&#xff0c;4.5V-16V宽电压输入范围 ACF防破音功能可选 超过90%效率&#xff0c;无需散热器 可选输出模式:BD和ISPW 扩频功能&#xff0c;免电感滤波 模拟差分…

TMC4671——硬件矢量控制的伺服电机控制芯片

Trinamic研发的TMC4671为永磁同步电机、直流无刷电机、音圈电机、直流有刷电机和2相步进电机提供磁场定向控制&#xff0c;是一款完全集成伺服控制的芯片TMC4671凭借在牢固稳定的状态机中嵌入全部必要的控制回路来处理这大幅度降低能耗一市场需求的问题。 一. 嵌入式运动控制…

【机器学习】OpenCV高级图像处理

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OpenCV高级图像处理图像滤波线性滤波高斯滤波均值滤波双边滤波 非线性滤波中值滤…

AD域控服务器

1.AD域控服务器安装 2.客户端Windows10加入域环境 3.组织单位OU和域用户创建 目的是分部门管理用户和使用域用户登录客户端 4.域用户安全策略 5.当客户端密码锁住了,管理员解锁账户。 6.只允许域用户使用自己的电脑