C语言递归函数与汉诺塔问题简明理解

 更新时间:2022年07月07日 09:37:27   作者:ChampLixxx  
递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归函数一定具备结束条件

递归函数

直接或者间接调用函数本身。“自己调用自己”

什么情况下面可以使用递归呢?

解决一个问题时,解决思路化成与问题本身类似的问题时,“递归”

是不是所有的递归问题,C语言都能支持呢?

不是的

C语言能够解决的递归问题,必须要满足两个条件:

(1) 问题本身一个递归问题。

(2) 递归不能是无限递归

适合那些递归到一定程度时,答案是显而易见的。

一定需要有一个“跳出无限递归的条件”。

C语言是如何支持递归呢?

int age(int n) //从425行开始,定义了一个标识符 age 
						//age就表示求第n个人的年龄
		{
			if(n > 1)
			{
				return age(n-1)+2;
			}
			else if(n == 1)
			{
				return 10;
			}
		} 

Hanio(汉诺塔)问题

按照Hanio的规则,把n个盘子从A柱移动到C柱上面去,

中间可以利用B柱,需要将其移动的步骤打印出来。

a、确定函数名

Hanio : 一旦被确定,表示 按照Hanio的规则,把n个盘子从A柱移动到C柱上面去,中间可以利用B柱,需要将其移动的步骤打印出来。

b、确定参数

int n , char A , char B , char C

有多少个盘子

从哪里移 起点 A

移到哪儿去 终点 C

中间可以利用 中转站 B

c、确定返回值的类型 无

d、代码、算法具体实现

void Hanio(int n, char A, char B , char C)
			{
				if(n == 0)
				{
					return ;
				}
				//1.想办法(Hanio),把n-1个盘子从A柱移动到B柱,中间可以使用C柱
				Hanio(n-1, A ,C , B);
				//2.直接将最后那个盘子,从A柱移动到C柱 
				printf("%c -> %c\n", A , C); 
				//3.想办法(Hanio),把n-1个盘子从B柱移动到C柱,中间可以使用A柱 
				Hanio(n-1, B ,A , C);
			}

求斐波拉契数列的前n项和

	//Get_N : 表示求斐波拉契数列的第n项元素的值
	int Get_N(int n)
	{
		if(n == 1 || n == 2)
		{
			return 1;
		}
		return Get_N(n-1) + Get_N(n-2);
	}
	//sum_fei: 求斐波拉契数列的前n项和 
		//思路: 
			//先求前面的n-1的和,再加上最后一项元素的和
	int sum_fei(int n)
	{
		if(n == 1)
		{
			return 1;
		}
		return sum_fei(n-1) + Get_N(n);
	}

到此这篇关于C语言递归函数与汉诺塔问题简明理解的文章就介绍到这了,更多相关C语言递归函数 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++将音频PCM数据封装成wav文件的方法

    C++将音频PCM数据封装成wav文件的方法

    这篇文章主要为大家详细介绍了C++将音频PCM数据封装成wav文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Qt QCompleter自动补全的实现

    Qt QCompleter自动补全的实现

    本文主要介绍了Qt QCompleter自动补全的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • c++primer:变量和基本类型详解

    c++primer:变量和基本类型详解

    今天小编就为大家分享一篇关于C++Primer中变量和基本类型的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • C++11 并发指南之多线程初探

    C++11 并发指南之多线程初探

    这篇文章主要介绍了C++11 并发指南之多线程初探,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • CreateThread()与beginthread()的区别详细解析

    CreateThread()与beginthread()的区别详细解析

    很多开发者不清楚这两者之间的关系,他们随意选一个函数来用,发现也没有什么大问题,于是就忙于解决更为紧迫的任务去了。等到有一天忽然发现一个程序运行时间很长的时候会有细微的内存泄露,开发者绝对不会想到是因为这两套函数用混的结果
    2013-09-09
  • C++实现LeetCode(71.简化路径)

    C++实现LeetCode(71.简化路径)

    这篇文章主要介绍了C++实现LeetCode(71.简化路径),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现LeetCode(77.Combinations 组合项)

    C++实现LeetCode(77.Combinations 组合项)

    这篇文章主要介绍了C++实现LeetCode(Combinations 组合项),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++简明图解分析浅拷贝与深拷贝

    C++简明图解分析浅拷贝与深拷贝

    在c++中,深拷贝和浅拷贝也算是一个难点,特别是对于初学者来说,往往在不知道两者区别的情况下而错误的使用了浅拷贝,从而导致了野指针之类的问题,但是又因为缺少理解所以很难定位到问题所在
    2022-06-06
  • 通过c语言调用系统curl动态库的示例详解

    通过c语言调用系统curl动态库的示例详解

    这篇文章中我们将通过一个简单的示例来讲解如何在Ubuntu系统中通过C语言调用动态库(共享库)的方法,我们将使用libcurl库,这是一个基于客户端的URL传输库,广泛用于各种程序和应用中以访问网页和服务器数据,需要的朋友可以参考下
    2024-03-03
  • C语言中单引号和双引号用法详解

    C语言中单引号和双引号用法详解

    C语言中,单引号用于表示单个字符常量,而双引号用于表示字符串,单引号中的字符是int类型,双引号中的字符串是以null字符结尾的字符数组,本文介绍C语言中单引号和双引号用法,感兴趣的朋友一起看看吧
    2025-01-01

最新评论