“这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战”
题目 f(0) = 0; f(1) = 1; f(n) = f(n-1)+f(n-2) n>1时 思路 递归算法 斐波那契数列是典型的递归代表。递归算法的核心在于两点:
结束递归的边界条件 递归公式 递归公式简单理解起来,就是类似于我们高中数学里可以用式子表达的数列,类似于初中学的找前后的规律,只是把这个规律公式化了。
递归算法的两个核心要点,对应到代码算法的实现,也就是以下 3 步:
找整个递归的终止条件:递归应该在什么时候结束? 找返回值:应该给上一级返回什么信息? 本级递归应该做什么:这一级递归中,要完成什么任务? 举个例子:假设有个数列 1 3 5 7 9 11 … 找到第n项的值。在这个数列中,开始的一项是 1,是无规律可循的一项,这一项到数列的尽头了,是 “结束” 项;此后,每一项都是在其前一项的基础上加 2,得到的。因此可以写为:
边界条件:f(1) = 1 递归公式:f(n) = f(n-1)+2 找到上述的两个要点,就可以实现递归算法。
解题思路 这一道题中,要求返回斐波那契数列的第 n 项,从 0 开始。 斐波那契数列:0 1 1 2 3 5 8 13 … 可以知道其边界条件和递归公式分别为:
fibonacci(1) = 0, fibonacci(1) = 1,fibonacci(2) = 1; fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)
解法1 递归
var fib = function(n) {
if(n == 1 || n == 2){ //递归出口
return 1 ;
}else{
return fib( n - 1 ) + fib( n - 2 ); //递归体
}
};
这样会超栈在力扣中运行不出结果
解法二 动态规划储存值
var fib = function(n) {
var arr = [0 , 1];
for(var i = 2; i <= n;i++){
arr[i] = (arr[i-1] + arr[i-2]);
}
return arr[n];
};