【 经典永不过时——递归|C语言】

在大学之中,大部分学生都学不好C语言,是C语言越来越难学了吗? 应该准确来讲,是为什么这么多人学不会编程,C语言本身来讲有一定的难度,但毕竟不是最难的语言,所以学不好的主要还是自身的问题。作为用了十几年C语言的程序员在这尝试分析下为何这么多人学不好C语言? C语言本身存在一定难度 C语言相比现在比较流行的java,php,python等语言在入门的方面显得稍微难点,特别是里面的C语言,很多人放弃就是在... 阅读详情

*小白见解,如有不妥请多指教 *

前言:

递归在函数中一直是佛系,秉持着大事化小的概念。做事也是循循渐进,都是递推完成后才会进行回归。

一、斐波那契数列

1、什么是斐波那契数列数列?

又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)。从中不难看出数列是从第三项等于前面2项之和。

2、相关解法

根据它的相关公式,在项数小于2时值都为1。第3项开始可以应用公式F(n)=F(n - 1)+F(n - 2)。所以我们写出以下代码:

int Fibo(int i)
{
	if (i<=2)
		return 1;
	else
		return Fibo(i - 1) + Fibo(i - 2);

}

以上可以实现斐波那契数列,接下来可以代入主函数中进行验证。

//斐波那契数列实现
//1 1 2 3 5 8 13 21 33 54 88....
int Fibo(int i)
{
	if (i<=2)
		return 1;
	else
		return Fibo(i - 1) + Fibo(i - 2);

}

int main()
{
	int i = 0;
	scanf("%d", &i);
	int ret= Fibo( i);
	printf("%d", ret);
	return 0;
}

这里进行验证时,一般在40以上便会出现等待时间较长的现象。或者直接就会报出“栈溢出”提示。可以用循环进行优化

二、青蛙跳台阶

1、题意内容

一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶,例如:跳上第一级台阶只有一种跳法:直接跳 1 级即可.跳上两级台阶,有两种跳法: 每次跳 1 级,跳两次; 或者一次跳 2 级.问要跳上第 n 级台阶有多少种跳法?

2、解法思路

看到这里,结合第一个的数列。当只有一层台阶时,青蛙当然只有一种跳法;当有两层台阶时,青蛙可以先跳一层,再跳一层;或者直接跳两层,这是两种跳法;当有三层台阶时,青蛙可以选择先跳一层,剩下两层台阶,所以此时就是有两层台阶时的跳法,有2种,当青蛙选择第一次跳两层台阶时,剩下一层台阶,此时时有一层台阶时的跳法,有1种所以3层台阶时的方法是:2层台阶的方法 + 1层台阶的方法。以此类推可以得到:4层台阶 = 3层台阶方法 + 2层台阶方法…n层台阶 = n - 1层台阶方法 + n - 2层台阶方法

int jump(i)
{
    if (i == 1)
    {
        return 1;
    }
    if (i == 2)
    {
        return 2;
    }

    if (i >= 3)
    {
        return jump(i - 1) + jump(i - 2);
    }

}
int main()
{
    int i = 0;
    scanf_s("%d", &i);
    int ret = jump(i);
    printf("%d", ret);
    return 0;
}

三、汉诺塔

1、相关背景描述

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。
在这里插入图片描述

2、解法思路

当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;若n为奇数,按顺时针方向依次摆放 A C B。

void Hanoi(int n, char a, char b, char c);
void Move(int n, char a, char b);
int count;
int main()
{
    int n = 8;
    printf("汉诺塔的层数:\n");
    scanf(" %d", &n);
    Hanoi(n, 'A', 'B', 'C');
    Sleep(20000);
    return 0;
}
void Hanoi(int n, char a, char b, char c)
{
    if (n == 1)
    {
        Move(n, a, c);
    }
    else
    {
        Hanoi(n - 1, a, c, b);
        Move(n, a, c);
        Hanoi(n - 1, b, a, c);
    }
}
void Move(int n, char a, char b)
{
    count++;
    printf("第%d次移动 Move %d: Move from %c to %c !\n", count, n, a, b);
}

以上便是对于递归的一些经典题型解法和相关分享。

Turbo C DOSBox版经典C语言开发环境配置与实战 Turbo C 早已退出历史舞台,但它留下的遗产仍在闪光:一体化 IDE 的雏形即时反馈的学习范式贴近硬件的编程教育简洁高效的工程美学它告诉我们:最好的教学工具,不是功能最多的,而是能让初学者最快获得成就感的那个。所以,下次当你看到某个学生对着蓝底白字的 TC 界面发呆时,请不要笑他落伍——也许,他正站在巨人的肩膀上,第一次触摸到编程的本质。💫“有些工具注定会被淘汰,但它们点燃的思想之火,永远不会熄灭。” 🔥本文还有配套的精品资源,点击获取。 阅读详情

相关推荐

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

C语言代码的诗意之美:从斐波那契到函数指针的优雅实践

在编程领域,代码的优雅与效率同等重要。从基础概念来看,优秀的代码不仅是功能的实现,更是逻辑与艺术的结合。其原理在于通过简洁的语法、清晰的结构和巧妙的抽象,将复杂问题转化为直观的解决方案。这种代码具有极高的技术价值,它能提升可读性、可维护性,并激发编程的创造力与乐趣。在实际应用场景中,无论是算法实现、系统设计还是底层优化,都能看到这种美学的体现。本文聚焦于C语言,通过函数指针、递归算法等核心概念,结合位运算、双指针等热词,展示了如何编写既高效又富有诗意的代码,让编程成为一种艺术创作。

weixin_34220179的博客 293

GNSS差分码偏差(DCB)从原理到实战:如何避免数据处理中的常见错误

本文深入解析GNSS差分码偏差(DCB)的原理及其对高精度定位的关键影响。针对数据处理中因忽略DCB校正导致的常见错误,如单系统PPP高程偏差、多系统融合精度下降及电离层研究失真等,提供了实战解决方案与主流DCB产品获取、集成方法,帮助用户有效规避陷阱,提升数据处理精度。

k5l6m的博客 223

c语言dfs非递归算法,图的BFS以及DFS递归非递归实现

image.png本文所使用的所有邻接表以及邻接矩阵定义均在之前博客,这里不再赘述一、深度优先遍历DFS(Depth-first search)1.1.1 DFS递归邻接表实现原理图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历。它的基本思想是:首先访问出发点v,并将其标记为已访问过;然后选取与v邻接的未被访问的任意一个顶点w,并访问它:再选取与w邻接的未被访问的任一顶点并访问,以此重复进行。...

weixin_42511712的博客 1562

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 187

# 多用户 JupyterHub 配置教程(通用 Linux 服务器版)

以上即是通用 Linux 服务器上的多用户 JupyterHub 实战配置。从安装认证与 Spawner 选择自动创建系统用户到反代与运维,覆盖了小团队到中等规模的主流场景。根据团队增长与合规要求,你可以进一步引入、统一身份源(LDAP/OAuth2/Keycloak)与资源配额治理,平滑演进到企业级部署。

数字化老司机 1288

《C语言速成》

BIT-0-C语言课程课前准备 养成写博客的习惯 博客的重要性: 1. 自己写博客,是对所学知识的总结 2. 写博客可以记录你学习的一个过程和心得,给面试官更多了解你的机会,同时增加面试的谈资。 3. 写博客说明你是一个愿意分享的人。 优快云 博客园 51CTO-比较推荐 开源中国 自己搭建(服务器+域名; github博客) github的重要性 https://github.com/ 1. 大公司喜欢的东西 2. 了解git --->我是教程 3. 下去先了解,再注册一下github账.

aiqq136的博客 2709

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

C 语言深度解剖

C 语言深度解剖 -------------------解开程序员面试笔试的秘密 以含金量勇敢挑战国内外同类书籍 陈正冲 编著 石 虎 审阅 版权申明 本书尚未出版,先放到网上给大家免费 下载和阅览。本书正式出版前读者可以仔细 研读和自由传阅本书电子版,但不允许私自 大量印刷和销售。出版社如想出版此书可通 过邮件或博客留言联系作者商谈出版事宜。 对于非法盗印或盗版,作者将本着愚公 移山的精神,孜孜...

weixin_37937054的博客 1328

科研党必看!Zotero+Claude3插件实战:如何用AI高效阅读文献(附详细配置步骤)

本文详细介绍了如何通过Zotero与Claude3插件的深度整合,实现科研文献的高效阅读与管理。从环境配置到核心功能实战,包括智能摘要生成、精准学术翻译和论文写作辅助等,帮助科研人员大幅提升工作效率。特别适合需要处理大量文献的研究者使用。

o0p1q2r3的博客 430

基于simulink的BMS系统中电池单体故障隔离与恢复建模

本文介绍了使用Simulink构建BMS电池单体故障诊断与容错控制模型的方法。主要内容包括:1)搭建12串锂电池组模型;2)实现单体故障注入(过压、断线等);3)设计故障诊断与隔离模块(采用Stateflow状态机);4)开发恢复判断逻辑(需满足电压、温度等条件);5)系统监控与仿真设置。文章还提供了工程实践建议,如防环流设计、通信冗余等,并指出进阶方向(多故障处理、AI预警等)。该模型适用于新能源汽车、储能系统的BMS设计,可提高系统可靠性和安全性。

xiaoheshang_123的博客 140

复古c语言代码修复与解析-骑士巡游问题

摘要:本报告详细记录了"骑士巡游"古代码的现代化修复过程。通过修正非标准头文件、规范函数声明等操作使代码符合现代C标准,并添加递归深度限制(MAX_DEPTH=10000)和运行超时检查(TIME_LIMIT=2.0s)解决了原程序卡死问题。开发过程中采用Dev-C++和VSCode双环境调试,通过Gitee进行版本管理,最终形成完整的技术文档。实践表明,该修复方案能有效处理8×8以内棋盘的巡游问题,运行时间控制在2秒内,成功实现了从语法修复到算法优化的完整工程实践,提升了递归算法理解与

wangshiying2007的博客 648

麻雀搜索算法(SSA)详解:从鸟群智能到优化实践

麻雀搜索算法(SSA)是一种新型群智能优化算法,模拟麻雀群体的觅食行为和反捕食机制。该算法将优化问题转化为麻雀群体对食物源的搜索过程,通过发现者、加入者和警戒者的角色分工实现高效优化。SSA具有原理新颖、参数合理、收敛快速等特点,在函数优化、工程设计和机器学习等领域展现出良好应用前景。算法通过数学模型模拟麻雀的觅食策略,包括发现者全局探索、加入者局部开发和警戒者危险预警机制,有效平衡了全局搜索与局部开发能力。SSA相比传统优化算法具有更好的收敛性和优化效果。

qq_42212808的博客 1072

快速排序---基础永不过时

快速排序

qq_52242662的博客 269

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

c 语言 获取句柄_在大学之中,大部分学生都学不好C语言,是C语言越来越难学了吗?...

应该准确来讲,是为什么这么多人学不会编程,C语言本身来讲有一定的难度,但毕竟不是最难的语言,所以学不好的主要还是自身的问题。作为用了十几年C语言的程序员在这尝试分析下为何这么多人学不好C语言?C语言本身存在一定难度C语言相比现在比较流行的java,php,python等语言在入门的方面显得稍微难点,特别是里面的C语言,很多人放弃就是在学到C语言之后就可以慢慢放弃了,觉得这个东西太难了,理解起来太抽...

weixin_30789475的博客 351

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言经典算法:从排序查找到动态规划,掌握编程底层逻辑

算法是计算机科学的核心,它定义了高效解决问题的通用方法与步骤。其原理在于通过精确的步骤描述和逻辑控制,将复杂问题分解为可计算的基本操作。掌握经典算法对于理解程序性能、优化资源利用具有不可替代的技术价值,是构建高性能系统、数据库、编译器及搜索引擎等基础设施的基石。在实际应用中,无论是数据处理、路径规划还是字符串匹配,算法都发挥着关键作用。本文聚焦于使用C语言这一贴近硬件的语言实现经典算法,深入探讨了排序、查找、字符串匹配(如KMP算法)、图遍历及动态规划等核心主题,并分析了在工程实践中结合内存管理与硬件特性(

weixin_33326218的博客 241

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C语言二叉树后序遍历非递归实现】:掌握高效栈模拟算法的5大核心步骤

掌握C语言树的后序遍历非递归实现,解决二叉树遍历效率难题。采用栈模拟替代递归,清晰步骤解析适用算法竞赛与系统编程,内存更优、控制更强。5大核心步骤详解,值得收藏。

LogicPlex的博客 723

C语言stdlid是什么函数,从Rust到远方:C星系

这篇博客文章是这一系列解释如何将Rust发射到地球以外的许多星系的文章的一部分:前奏,WebAssembly 星系ASM.js星系C星系(当前这一集)PHP星系,以及NodeJS 星系今天将要探索的是C语言星系。这篇文章会解释什么是C语言(比较简要),理论上怎样编译Rust供C使用,以及如何在实际使用从Rust和C两方面来实现我们的Rust解析器。我们还将看到如何测试这样的绑定。什么是C语言,为什...

weixin_32827751的博客 836

C语言函数核心解析:从声明调用到递归指针的编程实践

函数作为编程语言中的核心概念,是实现代码模块化和复用的基本单元。其原理在于将特定功能的代码块封装为独立实体,通过参数接收输入,经内部逻辑处理后返回结果,从而提升代码的可读性、可维护性和复用性。在C语言中,函数的技术价值尤为突出,它不仅支撑了程序的结构化设计,更是实现递归算法、回调机制等高级编程范式的基础。理解函数的声明、定义与调用,掌握值传递、指针传递等参数传递方式,是编写高效、安全C程序的关键。本文聚焦C语言函数的深度应用,通过剖析递归函数与函数指针等高级特性,结合参数传递的底层机制与变量作用域规则,为开

weixin_34293141的博客 318

一本支持研究型教学的C语言教材

我所编写的C语言教材特色突出,是一本支持研究型教学的教材,同时也是一本支持学生自主学习的教材。 首先,本教材以现代教育理念为指导,大胆探索,勇于创新,在教材层面支持研究型教学。 现代教育的重中之重是如何培养学生的创新能力。在这个问题上,教育界存在一个误区,就是强调“练”,强调“用”(如只注重让学生参加“实训”,参与“项目”等等),而忽视了“学”。知识来自于实践,在实践中当然可以激发学生的创新兴

C语言内涵教程 1296

【C语言】要掌握好多少知识点才能做好C语言项目?

很多初学C语言的小伙伴,在学习之初并没有一个大概的概念,学习这门语言需要掌握多少知识点,怎么才算学的差不多? C语言的精髓点在哪? 学到多少东西才能够达到做项目的标准?学习的时候需要注意哪些细节点?疑问太多以至于压得自己喘不过气来。笔者从项目的角度分析C语言到底需要掌握哪些知识,为什么要去掌握这些点,怎么去掌握,在此尝试着总结以下几点,未必都是对的,起码可以做到亲身经历。 基本的数据操作,运算规则,常见程序结构设计 很多人觉得这么几点我都看了多少遍了,早就烂熟于心了。举个简单的例子,printf打

致力于C语言C++知识分享! 298

c语言中连接作用的函数,C语言函数编译过程

一、程序编译执行过程程序的编译执行过程分为4个阶段:预处理阶段、编译阶段、汇编阶段、连接阶段1. 预处理阶段:预处理器(cpp)处理以头文件、宏、条件编译(字符#开头)等内容的替换。此阶段不进行语法检查,只进行简单的替换工作,修改原始的C程序,得到另一个C程序,通常以.i作为文件扩展名,产生的.i文件会变大(PS:增加了替换后的内容)。gcc -o hello.i -E hello.c2. 编译阶...

weixin_39809168的博客 607

c语言调用python接口_从C、C++中调用Python

从C、C++语言编写的程序中调用Python可以加快编程速度,充分利用Python编程的便捷性。需要理解的问题:支持callback函数的库Callback在维基上的解释是:在计算机编程中,一个callback是一段可执行代码,它作为参数传递给其他代码,以在适当的时候使这段参数代码被调用执行(call back/execute)。它有同步callback和异步callback二种,取决于其他代码与...

weixin_39554434的博客 565

C语言函数三部曲总结与扩展

本文总结了C语言函数编程的核心要点,分为基本三部曲(声明、定义、调用)和扩展细节两大模块。基本三部曲详细介绍了函数声明格式、定义规范及调用方式;扩展部分深入讲解了10个关键知识点,包括函数原型作用、参数传递方式、作用域规则、返回值处理、递归实现、函数指针应用、变长参数函数等实用技巧。文章通过代码示例展示了每种用法的正确实现方式,并特别强调了常见错误防范和良好编程习惯,如参数const修饰、静态变量使用、内联函数优化等,为C语言开发者提供了一份全面的函数编程指南。

laocooon的博客 1635

【算法刷题(python语言)】递归

递归算法基础知识递归的定义递归的特点递归的三大要素递归的优化思路实战题汉诺塔问题参考资料 基础知识 递归的定义 在函数中调用函数自身的现象叫做递归。 递归的特点 1.一个问题可以分解成具有相同解决思路的子问题,这些问题都能够调用同一个函数 2.经过层层分解的子问题最后一定有一个不能再分解的固定值(即终止条件)。 递归的三大要素 要素一:函数的功能。 遇到递归函数的问题,首先应确定函数要实现的功能并定义该函数。 要素二:递归的结束条件。 确定递归的结束条件。此时既要求根据该参数能够直接得到结果,也要保证该结束

weixin_45626529的博客 318

python是不是比c语言难_解答:为什么很多人觉得C语言很难?

对初学者来说,C语言确实有一定的难点,但是C语言是基础的语言,并不是最难的所以学不好的主要还是自身的问题。依据本人这么多年的经验,这尝试分析下为何这么多人学不好C语言?C语言本身存在一定难度C语言主要应用于操作系统、嵌入式底层开发等,在这些领域C语言一直都咱局主导位置,但是在入门上现在比较热门的php、python、java等语言比C语言稍微容易一些。所以很多人学习到C语言的时候,理解起来很抽象,...

weixin_39637059的博客 762
上一篇: 初识指针——C语言
下一篇: 三子棋详解
小鱼君
博客等级 码龄4年 530粉丝 33原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值