递归的用法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43236953/article/details/83099619

递归的定义:程序调用自身的编程技巧。
递归一般用来将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。(即大事化小)
递归的两个必要条件:
(1)限制条件。即满足这个限制条件的时候,递归就不再继续了。
(2)每次递归调用后越来越接近这个限制条件。
例如:输入一个无符号整型值,按照顺序依次打印它的每一位。如:1234,输出1 2 3 4.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//递归函数
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num = 1234;
	print(num);
	return 0;
}

执行结果如下:
在这里插入图片描述
递归经典的例子就是斐波那契数,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//递归函数
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);//第三个数为前两个数之和
	}
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	printf("%d\n", fib(num));
	return 0;
}

求第五个斐波那契数,执行结果如下:
在这里插入图片描述
但是递归在使用过程中,每往前递推一次产生一个新的递归数,系统就要给这个新的递归数分配空间,当递归的次数过多时,例如求第50个斐波那契数时,需要分配的空间过多,计算机不会很快的算出来,或需要很长的时间甚至算不出来,这时它就出现了栈溢出的情况。
例如,算斐波那契数中第三个数要求多少次,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//递归函数
int count = 0;
int fib(int n)
{
	if (n == 3)
		count++;
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);//第三个数为前两个数之和
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	printf("第%d个斐波那契数是%d\n",num, fib(num));
	printf("第三个斐波那契数一共计算了%d次\n", count);
	return 0;
}

执行结果如下:
在这里插入图片描述
因此,在使用递归时,递归次数较少的可以使用,次数较多的就需要优化算法。当然,有能力的话自己写一个新的算法也是很不错的。

展开阅读全文

没有更多推荐了,返回首页