什么是递归
简单的一句话说,程序调用自身的编程技巧成为递归.
从字面意思来看:
递,即递推,可以粗浅的理解为是由第一层代码递推到最后一层.
归,即回归,可以理解为由最后一层代码计算完后,一步步回归到第一层的过程.
递归的主要思考方式就在于:大事化小
使用递归的好处
可以把一个复杂的问题转化为一个与原问题相似的但规模较小的问题求解
用少量的程序就可以描述出递归过程中大量且重复的计算,大大减小了代码量
递归的两个必要条件以及写代码的解决思路
1. 存在限制条件
当满足这个限制条件的时候,递归就不再继续.
判断(if-else语句)是否符合限制条件,来控制是否继续递归下去
2.每次递归调用之后越来越接近这个限制条件.
也就是每次递归的时候参数越来越小,也就是参数越来越接近限制条件的值.
一道例题
下面以牛客网的一道题:乐乐上台阶为例,这里附上链接:
小乐乐走台阶_牛客题霸_牛客网 (nowcoder.com)
解题步骤:
1.写出乐乐走n阶台阶不同可能性的范围,由题得,台阶的限制范围是1-30;
2.为了列出条件表达式,乐乐走1阶台阶时可能性有1种,走2阶台阶时可能性有来2种.
设函数fib(n)n为乐乐要走的台阶数,可以得出乐乐要走n个台阶时,转换成公式的表达式就是:
fib(n)=fib(n-1)-fib(n-2);
这里附上三种情况下的表达式的图,方便大家理解:
大家在写递归题的时候,也可以像我这样画一个分段表达式,思路会更清晰
这里附上完整代码~
#include<stdio.h>
int fib(int n)
{
if (n == 1)return 1;
else if (n == 2)return 2;
else return fib(n - 1)+fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", fib(n));
}
总结:
回看文章刚开始时,我为大家提供的思路,都在题中有体现.
1.每次递归调用更接近限制条件(即n=1/n=2).
2.用判断语句看是否符合限制条件,是否控制继续递归下去,在上面的图中可以很好的说明.
其实大部分的递归题都可以这样做,希望大家能从我的文章中学到有用的知识~