<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> 斐波那契数值 </title>
<!--
1 1 2 3 5 8 13 21 34 55.....
我要写一个函数,求第n列是几
例:如果n为6,我就要求出8
第6列 = 第6-1列 + 第6-2列,
算6-1列也就是第5列还要得到 5-1列 + 5-2列
算5-1列也就是第4列还要得到 4-1列 + 4-2列
算4-1列也就是第3列还要得到 3-1列 + 3-2列
算3-1列也就是第2列 ,不用得了,直接得到1
算3-2列也就是第1列,不用得了, 直接得到1
出口是:如果是第1列或第2列,那么直接得到1
-->
<script>
function fibNumber(n) {
if (n == 1 || n == 2) {
return 1;
}
return fibNumber(n - 1) + fibNumber(n - 2);
}
console.log(fibNumber(8)); // 21
</script>
</head>
<body>
<script>
// 效率不高
// 因为好多列在左边那个递归中肯定已经算过了,但是右边那个递归又来重复算了一次
// 解决办法:
// 每次算出某一列的结果先存起来,下次再来算之前,先判断它有没有算过,如果有算过,就直接把结果拿出来就行了
var count = 0;
var obj = {};
function fibNumber(n) {
count++;
// 先看之前有没有算出来过
if (obj[n]) {
// 如果有直接取出来返回
return obj[n];
} else {
if (n == 1 || n == 2) {
return 1;
}
obj[n] = fibNumber(n - 1) + fibNumber(n - 2);
return obj[n];
}
}
console.log("取斐波那契数值: " + fibNumber(8) + " 需要循环 " + count + " 次");
// 取斐波那契数值: 21 需要循环 13 次
</script>
</body>
</html>
网友评论