函数的递归

目录

什么是函数的递归

函数递归的必要条件

函数递归的练习

求字符串长度

问题

分析

代码

运行结果

通过递归的方法打印数字

问题

分析

代码

运行结果

输出前n项斐波那契数列

问题

分析

代码

运行结果

汉诺塔问题

问题

分析

运行结果

青蛙跳台阶问题

问题

分析

代码

运行结果


什么是函数的递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的。
一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,
递归策略。
递归的优势在于只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思路在于:把大事化小。

函数递归的必要条件

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

函数递归的练习

下面我们通过几个具体的问题来具体的了解函数的递归。

求字符串长度

问题

用函数递归的方式求字符串长度

分析

首先我们知道字符串结束的标志是‘\0’,所以当字符为\0时就可以当作我们的限制此时直接可以返回1,当字符不为\0时我们返回1+前一个字符(再次调用此函数)。

代码

int Strlen1(char* arr)
{
	if (*arr == '\0')
		return 0;
	else
		return 1 + Strlen1(arr + 1);
}
int main()
{
	char str[] = "abcdethrhr";
	printf("%d", Strlen1(str));
	return 0;
}

运行结果

通过递归的方法打印数字

问题

输入一串数字例如1234,然后通过函数递归的方式从左向右1 2 3 4 的打印出来。

分析

我们可以通过除10取余的方式依次取出4 3 2 1,但是题目要求的是1 2 3 4的打印出来,我们可以这样先把1234分解为

123 4,然后将123分解为

12 3 4,再将12分解为

1 2 3 4
求n的阶乘

代码

int print(int x)
{
	if (x >= 10)
	{
		print(x / 10);
	}

	printf("%d ",x%10);

}
int main()
{
	unsigned int num = 1234;
	scanf("%d", &num);
	print(num);
	return 0;
}

运行结果

输出前n项斐波那契数列

问题

用函数递归的方式实现输出斐波那契数列的前n项

分析

我们知道斐波那契数列的第1项和第2项都是1,后面的每一项都是前两项之和,那么我们就可以设置它的限制为n==1||n==2(n为项数)此时直接返回1就行了,当n>2时我们可以直接返回它前两项之和,求前两项的时候通过递归调用自身就可以了。

代码

int Fio(int n)
{

	if (n == 1 || n == 2)
		return 1;

	else
		return Fio(n - 1) + Fio(n - 2);

}
int main()
{
	int num = 0;
	scanf("%d", &num);
	for (int i = 1; i <= num; i++)
	{
		printf("%d ", Fio(i));
	}
	return 0;
}

运行结果

汉诺塔问题

问题

实现如图效果

在这里插入图片描述

                                 A                                          B                                            C

分析

当n=1时我们直接把A上的盘子移动到C上。

当n>1时我们先把(n-1)A上的盘子移到B(A->B),然后A->C,再将(n-1)B上的盘子移到C上(B->C)。

代码

void move1(char x, char y)
{
	printf("%c->%c\n", x, y);
}
void Hanio(int n,char x,char y,char z)
{
	if (n == 1)
		move1(x, z);
	else
	{
		Hanio(n - 1, x, z, y);	
		move1(x, z);
		Hanio(n - 1, y, x, z);
	}
		

}

int main()
{
	int n = 0;
	printf("输入汉诺塔的阶数:");
	scanf("%d", &n);
	Hanio(n, 'A', 'B', 'C');
	return 0;
}

运行结果

青蛙跳台阶问题

问题

一直青蛙一次只能跳一个或者两个台阶,请问跳到n阶共有几种跳发,用函数递归的方法给出结果。

分析

跳到1台阶共1种方法,跳到2台阶共2钟方法,跳到3台阶共3中,4台阶共5种···,我们可以得出规律,跳到n阶的方法数等于跳到n-1阶的方法数加上跳到n-2阶的方法数。

代码

int jump(int x)
{
	if (1 == x)
		return 1;
	else if (2 == x)
		return 2;
	else
		return jump(x - 1) + jump(x - 2);
}
int main()
{
	int num = 0,style = 0;
	printf("输入阶梯数:\n");
	scanf("%d", &num);
	style = jump(num);
	printf("%d", style);
	return 0;
}

运行结果

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值