4. 蓝桥杯算法竞赛系列第二章——深入理解重难点之递归(上)

76 阅读2分钟

蓝桥杯算法竞赛系列第二章——深入理解重难点之递归(上)

[TOC]

三、怎么玩转递归

==在重复中找变化,在变化中找重复!==

1、大招:递归“三段论式”设计经验

  • 找重复-->找子问题
  • 找变化-->找重复中的变化量作为参数
  • 找边界-->找参数变化趋势设计出口 【最好写在函数的开头】

2、练习策略

  • 循环改递归解题
  • 经典递归讲解
  • 大量练习,总结规律,掌握套路
  • 找到感觉,挑战高难度

四、精选练习题讲解

1、求n的阶乘

注意:为了方便大家伙的理解,本题没有考虑 n == 0 的情况

三段论:

  1. 找重复:n * (n - 1)的阶乘,求(n - 1)的阶乘是原问题的重复,规模更小,是原问题的子问题。
  2. 找变化:找重复中的变化的量作为参数。本题中很明显是 n 在变化,所以函数定义过程中的形参是 n.
  3. 找边界:也就是出口的判断,什么时候让函数停止。显然本题中当 n == 1 时结束。

代码执行

#include<stdio.h>
 
//本题中的变化量是n,所以用作形式参数
int factor(int n)
{
	//出口的判断,最好写在函数的开头,本题中当n == 1时就意味着到边界了,应该终止程序
	if (n == 1)
	{
		return 1;
	}
	//(n - 1)的阶乘是原问题的重复,是其子问题,规模更小
	return n * factor(n - 1);
}
 
int main()
{
	int n = 5;
 
	int ret = factor(5);
 
	printf("%d\n", ret);
 
	return 0;
}

注意: 为了言简意赅,本题中没有考虑 n == 0 的情况。可能看到这里你还是不能完全理解递归,那么我们应该先理解清楚“上面函数的执行过程”,尤其是,函数执行结束之后,回到调用位置继续往下执行。

1、求n的阶乘

注意:建议上面的执行过程,请铁汁们在下面的练习中每一个都画出来,这样你才能清楚地体会到“函数的执行过程”,明白递归的奥秘。