递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题、汉诺塔问题等,在研究递归问题时我们要注意三点:
1.递归的结束条件
2.递归在每次进行过程中,都得离条件越来越近
3.相邻两次递归调用之间的关联关系

汉诺塔问题:

有三根杆子A, B, C。A杆上有N个(N > 1)穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面,可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆, 但都必须尊循上述两条规则。求移动的过程。

int step = 0; //设置全局变量step记录步数
void move(int i,char form,char to){
	printf("第%d步,将第%d个盘子从%c移动到%c\n", ++step,i,form, to);
}
void Hanio(int n,char a,char b,char c){
	if (n == 0)
	{
		return;
	}
	Hanio(n - 1,a,c,b); //第n-1个A柱上的盘子通过C柱移动到B柱
	move(n, a, c);  //将A柱上编号为n的盘子移动到C柱
	Hanio(n - 1, b, a, c); //再将B柱上的第n-1个盘子通过A柱移动到C柱
}
int main(){
	    int n;
		printf("请输入汉诺塔中有多少个圆盘:\n");
		scanf("%d", &n);
		Hanio(n, 'A', 'B', 'C'); //将n个圆盘从A柱通过B柱移动到C柱
		system("pause");
		return 0;
}

运行结果:

在这里插入图片描述

青蛙跳台阶问题:

一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
当n = 1,只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法。可以总结为f(n)=f(n-1)+f(n-2),本质上与斐波那契数列相同。

int Frog(int n){
	if (n <= 2 && n >= 0)
	{
		return n;
	}
	else if (n < 0)
	{
		printf("您的输入错误\n");
		return n;
	}else
	{
		return Frog(n - 1) + Frog(n - 2);
	}
}
int main(){
		int n;
		printf("请输入有几级台阶:\n");
		scanf("%d", &n);
		int result = Frog(n);
		if(n >= 0){ 
			printf("青蛙有%d种跳法\n", result);
		}
		system("pause");
		return 0;
}

运行结果

在这里插入图片描述

到此这篇关于C语言递归之汉诺塔问题和青蛙跳台阶问题的文章就介绍到这了,更多相关C语言递归汉诺塔青蛙跳台阶内容请搜索程序员的世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员的世界!

C语言递归之汉诺塔和青蛙跳台阶问题的更多相关文章

  1. 虚函数表-C++多态的实现原理解析

    参考:http://c.biancheng.net/view/267.html1、说明我们都知道多态指的是父类的指针在运行中指向子类,那么它的实现原理是什么呢?答案是虚函数表在 关于virtual 一文中,我们详细了解了C++多态的使用方式,我们知道没有 virtual 关键子就没法使用多态2、虚函......

  2. 关于 C++ 中的强制转换 - 基础篇

    引言假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1。此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型对象中的函数 func1。这时,就形成了多态。包含虚函数的类 A,我们也称为多态类。由于派生类 B 完......

  3. C++ 控制台弹出文件管理对话框案例

    在控制台程序中打开文件管理对话框,效果图如下所示:在需要弹出对话框的地方插入以下代码://打开文件管理窗口TCHAR szBuffer[MAX_PATH] = { 0 };OPENFILENAME file = { 0 };file.hwndOwner = NULL;file.lStructSize......

  4. C/C++内存对齐详解

    1、什么是内存对齐 还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。 //32位系统 #inclu......

  5. C语言之漫谈指针(下)

    C语言之漫谈指针(下)在上节我们讲到了一些关于指针的基础知识:详见:C语言之漫谈指针(上)本节大纲:零.小tips一.字符指针二.指针数组与数组指针三.数组传参与指针传参四.函数指针及函数指针数组五.回调函数六.例题讲解 零.小tips在正式开始下节之前,我们先来穿插两个小tips:1.打印函数......

  6. C语言位运算解决只出现一次的数字

    解题所需要的C语言基础知识hello!从现在开始就进入本题解的正式内容了。首先给大家用图解的方式介绍3个C语言位运算的基本操作符 & | ^这些知识对下面的解题都非常重要,一定要熟练掌握,不然等会会有一种“我在哪,我是谁我在干什么”的感觉。只出现一次的数字I题目描述只出现一次的数字给定一个非......

  7. C++ 入门篇

    C++基础入门 1 C++初识 1.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开 1.1.2 创建文件 右键源文件,选......

  8. OpenCV 之 图象几何变换

    二维平面中,图像的几何变换有等距、相似、仿射、投影等,如下所示: 1 图象几何变换1.1 等距变换 等距变换 (Isometric Transformation),是一种二维的刚体变换,可理解为旋转和平移的组合 $\quad \beg......

  9. 关于C++中构造函数的常见疑问

    基本概念我们已经知道在定义一个对象时,该对象会根据你传入的参数来调用类中对应的构造函数。同时,在释放这个对象时,会调用类中的析构函数。其中,构造函数有三种,分别是默认构造函数,有参构造函数和拷贝构造函数。在类中,如果我们没有自行定义任何的构造函数,编译器会为我们提供两种构造函数(默认构造函数和拷贝构......

  10. std::async的使用总结

    C++98标准中并没有线程库的存在,直到C++11中才终于提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多线程库对应的头文件是#include ,类名为std::thread。然而线程毕竟是比较贴近系统的东西,使用起来仍然不是很方便,特别是线程同步及获取线程运行结......

随机推荐

  1. Android开发之AppWidget详解

    Android通知系统是它的一大特色,而其中,AppWidget是其中一个亮点。在开发应用的中,很多时候可以为其添加一个AppWidget显示在桌面中,及时方便的与用户进行交互。这里就简单的熟悉一下开发一个AppWidget的流程吧。想要在应用中创建一个AppWidget,至少需要以下几样东西:需要......

  2. python3 删除所有自定义变量的操作

    其实方法很简单~输入 reset, 选y。删除不可恢复。补充:Python中的del语句——变量删除Python中的del语句作用是删除变量,而不是删除数据>>> a = 1 # 变量a赋值>>> b = a # 将a赋值给b>>......

  3. js中获得当前时间是年份和月份

    js中获得当前时间是年份和月份,形如:201208 //获取完整的日期 var date=new Date; var year=date.getFullYear(); var month=date.getMonth()+1; month ......

  4. vue3如何优雅的实现移动端登录注册模块

    前言近期开发的移动端项目直接上了 vue3 ,新特性 composition api 确实带来了全新的开发体验.开发者在使用这些特性时可以将高耦合的状态和方法放在一起统一管理,并能视具体情况将高度复用的逻辑代码单独封装起来,这对提升整体代码架构的健壮性很有帮助.如今新启动的每个移动端项目基本上都包含......

  5. 【java框架】SpringBoot(5)--SpringBoot整合分布式Dubbo+Zookeeper

    1.理论概述1.1.分布式分布式系统是若干独立计算机的集合,这些计算机对于用户来讲就像单个系统。由多个系统集成成一个整体,提供多个功能,组合成一个板块,用户在使用上看起来是一个服务。(比如淘宝网)。 起源分布式系统出现的原因是:用多个廉价的、普通的机器完成单个计算机无法完成的计算、存储任务分布式......

  6. 精通MySQL之架构篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南。这份指南把大数据的【基础知识】【框架分析】【源码理解】都用自己的话描述出来,让伙伴自学从此不求人。大数据开发指南地址如下:github:https://github.com/Bi......

  7. ASP.NET通过自定义函数实现对字符串的大小写切换功能

    本文实例讲述了ASP.NET通过自定义函数实现对字符串的大小写切换功能。分享给大家供大家参考。具体实现方法如下:方法1:public string ToggleCase(string input){string result = string.Empty;char[] inputArray = in......

  8. Oracle数据库常用Sql语句

    1、为表空间增加新的数据文件alter tablespace ibomis add datafile 'D:\app\Administrator\oradata\IBOMISWC\ibomis02.DBF' size 20000m autoextend on next ......

  9. Java程序员都要懂得知识点:反射

    摘要:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于......

  10. Vue 内置组件keep-alive的使用示例

    keep-alive 是Vue内置的组件之一, 主要用于保留组件状态或避免重新渲染。作用在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验。一、keep-alive 用法< keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销......