前言
递归确实是一个奇妙的思维方式,在了解了递归的实现原理之后不禁让人感叹算法的巧妙!
一、递归是什么?
简单来说,就是一个函数直接或间接调用自身的一种方法。通常递归可以将一个复杂的大型问题层层转化为一个与原问题相似的规模较小的问题来求解。它的核心思想是把大事化小。
递归就好比查英文字典,当查找第一个词时你发现这个词的解释中有一个单词你看不懂,于是你开始查找第二个单词,当查第二个单词的时候你发现这个单词的解释中依然有你看不懂的单词,于是你开始了第三次查找…直到有一个单词的解释你全部都能看懂,那么递归结束,然后开始后退,逐个明白之前查过的每一个单词,最后知道了第一个单词的意思。
二、递归思想
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 递归继续;
第二次 nFactorialDigui(3) 此时n>1 递归继续;
第三次 nFactorialDigui(2) 此时n>1 递归继续;
第四次 nFactorialDigui(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);
}
总结
由以上的两组代码大家可以从中看出递归的优点:递归只需要少量的程序就可以解决一些复杂问题的多次重复计算,大大减少了代码量!
转载:https://blog.csdn.net/weixin_50302770/article/details/117235827