递归的用法

本文深入讲解递归算法,包括其定义、工作原理及经典应用案例,如斐波那契数列。同时,探讨了递归在处理大规模问题时可能遇到的栈溢出问题,并提出优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归的定义:程序调用自身的编程技巧。
递归一般用来将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。(即大事化小)
递归的两个必要条件:
(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;
}

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

PostgreSQL中的递归查询可以通过使用WITH RECURSIVE语句来实现。这种查询方式可以用于解决需要多层循环嵌套的问题。下面是一个示例: ```sql WITH RECURSIVE recursive_query AS ( -- 初始查询 SELECT initial_query UNION ALL -- 递归查询 SELECT recursive_query FROM recursive_query, recursive_table WHERE recursive_condition ) -- 最终查询 SELECT final_query FROM recursive_query ``` 在上面的示例中,WITH RECURSIVE语句定义了一个递归查询,其中包含初始查询和递归查询两部分。初始查询用于指定递归查询的起始条件,递归查询用于指定递归的条件和操作。最终查询用于从递归查询结果中选择所需的数据。 请注意,递归查询中的recursive_table是递归查询的表,recursive_condition是递归查询的条件。这些可以根据实际需求进行修改。 下面是一个具体的示例,假设有一个地区表region,其中包含地区的id和父地区的id。我们要查询某个地区的所有子地区,可以使用递归查询来实现: ```sql WITH RECURSIVE recursive_query AS ( -- 初始查询 SELECT id, name FROM region WHERE id = 1 -- 假设要查询id为1的地区的所有子地区 UNION ALL -- 递归查询 SELECT region.id, region.name FROM recursive_query, region WHERE region.parent_id = recursive_query.id ) -- 最终查询 SELECT * FROM recursive_query ``` 上面的示例中,初始查询选择了id为1的地区,递归查询选择了所有父地区id等于初始查询结果中id的地区。最终查询选择了递归查询的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值