嗨,亲爱的小可爱们,我们今天一起来学习或复习一下递归算法的思想,其实接触递归好多年了,最近在学习JS,又重新接触到了,这次就来总结一下,分享一下自己在学习递归算法上的经历。
最初看到递归的时候很迷茫,真的不理解,初学觉得很难理解,不明白他真正的调用过程,以及他调用了自己为什么可以轻松的输出结果以及解决我们所需要的问题,一直习惯用循坏或数组来解决大型的问题,虽然思路清晰简单,但代码繁多。
递归通俗一点说就是自己调用自己。
那什么时候使用递归思想呢?当我们需要解决一个规模为N的问题,而这个规模N较大时,该问题又可以分解成若干个较小的问题,同时这些较小的问题又可以使用跟规模较大的问题同样的解决方法,那我们此时就可以利用递归思想来解决该规模为N的问题。
可以使用递归算法求解问题大多有以下特征:
1.原问题可以分解成若干较小的子问题
2.子问题有着与原问题相同的解决方法
3.必须要有终止条件,因为他不能无限的循坏调用本身
接下来,我们来看几个有意思的可以用递归解决的小问题:
1.求一个数的阶乘
阶乘的定义:0!=1,n!=n*(n-1)*(n-2)***1
如果用fac(n)来代表n的阶乘,会发生什么?
fac(0)=1
fac(1)=1
fac(2)=2*1=2*fac(1)
fac(3)=3*2*1=3*fac(2)
fac(4)=4*3*2*1=4*fac(3)
fac(5)=5*4*3*2*1=5*fac(4)
fac(6)=6*5*4*3*2*1=6*fac(5);
fac(7)=7*6*5*4*3*2*1=7*fac(6)
...
由此可以看出,
fac(n)=n*fac(n-1),n>=2
有了表达式跟终止条件,就可以很容易的用代码实现了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>求一个数的阶乘</title>
</head>
<body>
<script>
function fac(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * fac(n - 1);
}
var n = +prompt("请输入一个整数:");
console.log(n + "的阶乘是:" + fac(n));
</script>
</body>
</html>
2.求斐波那契数列:0,1,1,2,3,5,8,13,21......
递推式:
递推式有了,那代码实现是不是就很简单了呢
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>斐波那契数列</title>
</head>
<body>
<script>
function fun(n) {
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
return fun(n - 1) + fun(n - 2);
}
var n = +prompt("请输入一个整数:");
for (var i = 0; i <= n; i++) {
console.log(fun(i));
}
</script>
</body>
</html>