C语言—递归详解


前言

递归确实是一个奇妙的思维方式,在了解了递归的实现原理之后不禁让人感叹算法的巧妙!

一、递归是什么?

简单来说,就是一个函数直接或间接调用自身的一种方法。通常递归可以将一个复杂的大型问题层层转化为一个与原问题相似的规模较小的问题来求解。它的核心思想是把大事化小。

递归就好比查英文字典,当查找第一个词时你发现这个词的解释中有一个单词你看不懂,于是你开始查找第二个单词,当查第二个单词的时候你发现这个单词的解释中依然有你看不懂的单词,于是你开始了第三次查找…直到有一个单词的解释你全部都能看懂,那么递归结束,然后开始后退,逐个明白之前查过的每一个单词,最后知道了第一个单词的意思。


二、递归思想

1.递

将问题分解为若干个规模较小并与原问题形式相同的子问题,这些问题可以用相同的方法来解决。

2.归

当问题不断缩小规模的时候,一定有一个明确的结束递归的临界点,一旦达到这个临界点就从该点一路返回,最终到原点,问题得以解决!

3.递归的图解分析

在这里插入图片描述

三、递归的两个必要条件

1.递归出口

即存在限制条件,当满足这个条件时,递归不在继续。

2.问题规模不断缩小

即每次调用完递归之后越来越接近这个限制条件。


四、普通代码和递归版对比展示

1.求n的阶乘

非递归版:

int Factorial(int n) //非递归方法
{
	int num=1; 
	for (int i=1; i <= n; i++) //循环相乘
	{
		num = num*i;
	}
	return num;
}

递归版本:

int FactorialDigui(int n)//递归方法
{
	if (n <= 1)   //当n小于等于1跳出递归
		return 1;
	else
		return n*FactorialDigui(n - 1); 
}

递归版本底层实现思维导图:

在这里插入图片描述
递归思路分析:
当n大于1时继续执行FactorialDigui函数
第一次 nFactorialDigui(4) 此时n>1 递归继续;
第二次 n
FactorialDigui(3) 此时n>1 递归继续;
第三次 nFactorialDigui(2) 此时n>1 递归继续;
第四次 n
FactorialDigui(1) 此时n=1 跳出递归并且依次返回;


2.经典的斐波那契数列

非递归版:

int Fibonacci(int n)//迭代版本
{
	int firnumber=1;//定义的前两个数字中的第一个数字
	int sednumber=1;//定义的前两个数字中的第二个数字
	int result=1;
	while (n > 2)
	{
		firnumber = sednumber; //第二个数字赋给第一个数字
		sednumber = result;//第三个数字赋给第二个数字
		result = firnumber + sednumber;//第三个数字等于前两个之和
		n--;
	}
	return result;
}

递归版本:

int FibonacciDigui(int n)//递归版本n为第几个数字
{
	if (n <= 2) //前两个数字一定为1
		return 1;
	else  //若不是前两个数字则他的数值为前第一个和前第二个之和
		return FibonacciDigui(n - 1) + FibonacciDigui(n - 2);
}

总结

由以上的两组代码大家可以从中看出递归的优点:递归只需要少量的程序就可以解决一些复杂问题的多次重复计算,大大减少了代码量!

  • 65
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
Hanoi塔是一个经典的递归问题,它可以用C语言来实现。Hanoi塔问题的规则是,有三根柱子A、B、C,以及n个不同大小的圆盘,初始时,所有圆盘都放在柱子A上,目标是将所有圆盘从A柱子移动到C柱子上,每次只能移动一个圆盘,并且大的圆盘不能放在小的圆盘上面。 要解决Hanoi塔问题,可以使用递归的方法。递归的思想是将大问题分解成一个个小问题来解决,然后通过组合小问题的解来解决整个问题。 在这个问题中,我们可以将n个圆盘的移动分解为三个步骤: 1. 将n-1个圆盘从A柱子移动到B柱子上; 2. 将最大的一个圆盘从A柱子移动到C柱子上; 3. 将n-1个圆盘从B柱子移动到C柱子上。 这样,问题就被分解成了三个小问题,而这三个小问题与原问题的规模相比减小了,因此可以使用递归的方法来解决。 具体的C语言递归代码如下: ```c void hanoi(int n, char source, char auxiliary, char target) { if (n == 1) { // 只有一个圆盘时,直接从source柱子移动到target柱子上 printf("Move disk from %c to %c\n", source, target); return; } hanoi(n-1, source, target, auxiliary); // 递归调用步骤1 printf("Move disk from %c to %c\n", source, target); // 移动最大的圆盘 hanoi(n-1, auxiliary, source, target); // 递归调用步骤3 } int main() { int n; printf("Enter the number of disks: "); scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); // 调用递归函数 return 0; } ``` 通过上述C语言代码,我们可以递归地解决Hanoi塔问题,并输出每一步的移动方式。这个递归方法的时间复杂度是O(2^n),因为每个圆盘都要移动2^n次。但是由于递归的特性,它的空间复杂度是O(n),因为每次递归调用时需要保存函数的局部变量。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3 ERROR(s)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值