前言:
这段时间学的递归应用比较多。表面上递归不重要,只要理解就行。但是在实际应用中,递归对于这种m(n)与m(n-1)有规律关系的算法,是一种好用的工具。本文分为两部分,学会写递归和递归的应用。
一 、使用递归的姿势:
通过几个简单的案例来学会如何写递归:
题目1:求阶乘5!
步骤1:设置一个n值 .从n=1,2,3...这样开始枚举,直到最后发现规律
-分析题目可知:
n = 1 return m(1) = 1;
n = 2 return m(2) = 1*2 = 2
n = 3 return m(3) = 1*2*3 = 6
n = 4 return m(4) = 1*2*3 *4 = 24
n = 5 return m(5) = 24*5 = 120;
步骤2:上面的规律实际上可以看出:
n = 1 return m(1) = 1;
n = 2 return m(2) = m(1)*2
n = 3 return m(3) = m(2)*3
n = 4 return m(4) = m(3)*4
...
步骤3:得出 n = n return m(n) = m(n-1)*n;
步骤4:写出函数:
void method(int n)
{
if(n == 1)
{return 1;}
else
{
return method(n-1)*n;
}
}
得到出口m(1) = 1后,递归函数又从n = 2,3,4,5,6...n递增运行,得出m(2),m(3),(4)的值。最后每个值相加。得出最终的结果。
二、斐波那契数列(兔子问题)
当n = 1,m(1) = 1; n = 2 ,m(2) = 2;
n>2时
m(n) = m(n-1)+m(n-2);
转换为递归函数是
public static int method(int n)
{
if(n == 1)
return 1;
if(n == 2)
return 2;
return method(n-1)+method(n-2);
}
在这里通过枚举10到1得出的数据如下:
/* n = 10 re m9+m8; 89
* n = 9 re m8+m7; 55
* n = 8 re m7+m6; 34
* n = 7 re m6+m5; 21
* n = 6 re m5+m4; 13
* n = 5 re m4+m3; 8
* n = 4; re m3+m2; 5
* n = 3 re m2+m1; 3
* n = 2 re m2 = 2
* n = 1 re m1 = 1
*/
同理,n从n-1,n-2,n-3...直到2,1,得出m1 = 1,m2 = 2;
然后 n从1,2,3,4...直到n 算出 m1,m2,m3,m4...m(n)的值。
通过以上的算法可以算出看出递归的运行机制。并且在性能上面消耗还是比较打的。遍历了2n次。但是方法简便。
二、递归的应用。