C 函数递归

embedded/2024/10/11 13:29:04/

目录

什么是递归

递归的限制条件

递归的例子

1、用递归求n的阶乘

递归扩展学习

1、青蛙跳台阶

思路

代码实现 

2、汉诺塔问题​

思路

代码实现

总结


什么是递归

递归:“递推” + “回归”

在C语言中,函数递归就是:函数自己调用自己

将一件事情 “大事化小”,完成这些小事所用的方法都是相同的,只是参数不一样。


递归的限制条件

  1. 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  2. 每次递归调用之后越来越接近这个限制条件。

递归的例子

1、用递归求n的阶乘

//VS2022 x64    
#include<stdio.h>
int Fact(int n)    //实现阶乘的函数
{if (n == 0)       //限制条件return 1;elsereturn n * Fact(n - 1);    //递归    
}int main()
{int n = 0;scanf("%d", &n);int ret = Fact(n);       printf("%d\n", ret);        return 0;
}


递归扩展学习

1、青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

思路

 可以发现,跳到第n个台阶,最后一步,只有两种方法:

  • 从 第 n-1 个 楼梯跳上一级台阶;
  • 从 第 n-2 个 楼梯跳上两级台阶;

代码实现 

#include<stdio.h>
int Jump(int n)
{if (n == 1)return 1;else if (n == 2)return 2;elsereturn Jump(n - 1) + Jump(n - 2);
}int main()
{int n = 0;scanf("%d", &n);int sum = Jump(n);printf("小青蛙有 %d 种跳法到第 %d 台阶", sum, n);return 0;
}

2、汉诺塔问题​

给定三根柱子,记为 A,B,C,其中 A 柱子上有 n 个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?打印出每个步骤

移动时应注意:

  1. 一次只能移动一个盘子
  2. ​ 大的盘子不能压在小盘子上

思路

先从简单的三个盘子试试,可以先不看答案自己画一画,挺好玩的,注意规则噢

(1)n个盘子从A柱到C柱最少移动次数

 (2)打印出每个步骤

代码实现

#include<stdio.h>
void Move(char pos1, char pos2)		//打印步骤
{printf(" %c->%c ", pos1, pos2);
}//pos1 起点
//pos2 中转站
//pos3 目的地
void Hannoi(int n, char pos1, char pos2, char pos3)
{if (n == 1)Move(pos1, pos3);	else{Hannoi(n - 1, pos1, pos3, pos2);	//n-1个盘子借助 pow3 从 pow1->pow2Move(pos1, pos3);				//第n个盘子从 pos1 -> pos3Hannoi(n - 1, pos2, pos1, pos3);	//n-1个盘子借助 pos1 从 pos2->pos3}
}int main()
{int n = 0;	//需要移动的盘子数量scanf("%d", &n);Hannoi(n, 'A', 'B', 'C');return 0;
}


总结

函数递归对于我这种初学者比较困难,一直在思考怎么才能把递归讲的通俗易懂,很显然,目前的我还很难做到, 对于青蛙跳台阶、特别是汉诺塔问题,我还很难熟练掌握其思想。虽然现在不太行,但我相信在日后的不断学习,绝对能够把这些知识稳稳收入囊中为我所用,所以各位也不必着急,相信自己,一定可以!



http://www.ppmy.cn/embedded/19393.html

相关文章

中电金信:向“新”而行——探索融合架构的项目管理在保险行业的应用

近年来&#xff0c;险企在政策推动、市场牵引、自身发展、新技术应用日趋成熟等内外部因素的驱动下&#xff0c;积极投身到数字化转型的浪潮中。在拜访各类保险客户和合作项目的过程中&#xff0c;我们发现不少险企在数字化转型中或多或少都面临着战略如何落地、技术如何承接和…

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 文章目…

linux中新建一个超级管理员

新建一个管理员用户 admin useradd -u 0 -o admin u 用户号 指定用户的用户号&#xff1b;因为系统用户的用户号为 0&#xff0c;故指定用户号为 0&#xff1b; 如果同时有 -o 选项&#xff0c;则可以重复使用其他用户的标识号&#xff0c;因为系统本身存在用户号为 0 的系统用…

[羊城杯 2020]EasySer ---不会编程的崽

稍微带点反序列化&#xff0c;稍微。 常规扫描robots.txt,给出提示star1.php。 很明显的ssrf嘛。直接读 star1.php?pathhttp://127.0.0.1/star1.php <?php error_reporting(0); if ( $_SERVER[REMOTE_ADDR] "127.0.0.1" ) {highlight_file(__FILE__); } $f…

Selenium一本通

Selenium中文官方文档 从一个测试脚本说起 from selenium import webdriver #引入selenium webdriver模块 driver webdriver.Firefox() #初始化Firefox浏览器的webdriver对象&#xff0c;启动浏览器 driver.get("http://cn.bing.com/") #跳转到对应页面 assert Bi…

战胜DALL·E 3和 Midjourney的开源模型来了——playground-v2.5

这是首次超越闭源AI模型的开源时刻。Playground AI 前不久宣布Playground v2.5正式开源。Playground v2.5 是美学质量方面最先进的开源模型&#xff0c;特别关注增强的颜色和对比度、改进的多纵横比生成以及改进的以人为中心的精细细节。并且在美学质量方面树立了新标准&#x…

go基础(flag、json)

go基础 基础main函数数据类型类型转换switch函数计算效率go中实现工厂模式switch flag 解析命令行参数json结构体序列化map序列化struct 反序列化 基础 main函数 package main import "log" func main() {log.Println("hello world") }cd 到 main 文件夹下…