Js 求斐波那契数列第 n 项的值结果总不对

2019-04-23 09:13:45 +08:00
 Paperex

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
		var num = parseInt(window.prompt('input'));
		var first = 1;
		var second = 1;
		var third;
		if(num > 2){
			for(var i = 0; i < num-2; i++){
				third = first + second;
				first = second;
				second = third;
			}
			document.write(third);
		}
		else{
			document.write(1);
		}
	</script>
</body>
</html>

输出结果第 4 项为 3,第 5 项为 4.调试后发现 first 的结果总是 1,真是搞不懂,请大神帮忙看看!

4030 次点击
所在节点    JavaScript
17 条回复
yngby
2019-04-23 09:23:24 +08:00
为啥我试了一下没错呢
mango88
2019-04-23 09:24:54 +08:00
第一项难道不是 1 ?
wangsongyan
2019-04-23 09:26:07 +08:00
我这对的
vexjoe
2019-04-23 09:30:03 +08:00
wenzichel
2019-04-23 09:36:58 +08:00
没错的呀!

```javascript
function fb(num) {
var first = 1;
var second = 1;
var third;
if(num > 2){
for(var i = 0; i < num-2; i++){
third = first + second;
first = second;
second = third;
}
return third;
}
else{
return first;
}
}
for(let i=1; i<10; i++) {
console.log(i, fb(i));
}
/*
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
*/
```
wenzichel
2019-04-23 09:37:48 +08:00
不支持 markdown 啊,那我怎么删除我上面的这条评论呢
DJQTDJ
2019-04-23 10:09:54 +08:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var increment = 0;
while(increment < 100) {
var first = 1;
var second = 1;
var third;
if(increment > 2){
for(var i = 0; i < increment-2; i++){
third = first + second;
first = second;
second = third;
}
document.write(increment + ":" + third + "<br>");
}
else{
document.write(increment + ":" + 1 + "<br>");
}
increment++;
}
</script>
</body>
</html>

没问题吖
Jase
2019-04-23 10:18:34 +08:00
function fibonacci(n) {
if (n === 1) {
return 1;
}

if (n === 2) {
return 1;
}

return fibonacci(n - 1) + fibonacci(n - 2);
}
ytmsdy
2019-04-23 10:23:10 +08:00
@Jase 大兄弟,你这么写会爆栈的哦。。
Paperex
2019-04-23 11:00:15 +08:00
各位大哥,是我之前把 for 循环里的“ first ”写成了“ first ”。可这帖子没法删除……。感谢各位大神!
dartabe
2019-04-23 11:22:40 +08:00
各位大神 插一个问题 之前网上说这个数列求法最好不用递归 对 JS 是不是也成立呢?
gosansam
2019-04-23 11:35:19 +08:00
@dartabe 爆栈了解一下
airdge
2019-04-23 11:50:40 +08:00
function F(n) {
if (n == 1) {
return 1
} else if (n == 2) {
return 1
} else {
return F(n - 1) + F(n - 2)
}
}
console.log(F(9))
airdge
2019-04-23 11:53:36 +08:00
@airdge 没注意看评论 这种确实不行
stevenbipt
2019-04-23 11:55:05 +08:00
递归写法是个狼人~
silentstorm
2019-04-23 12:47:21 +08:00
通项公式:(Math.pow((1+Math.sqrt(5))/2,n)-Math.pow((1-Math.sqrt(5))/2,n))/Math.sqrt(5)
就是会有精度损失
bzw875
2019-04-23 13:10:16 +08:00
function fibonacci(n) {
if (n < 2) {
return 1;
}
var arr = [1,1];
for (i = 1; i < n; i++) {
arr[i + 1] = arr[i - 1] + arr[i];
}
return arr[n];
}
console.log(fibonacci(10));
你们要么函数栈太深,要么重复计算每个值,应该用一个数组保持每一项的值。这样比较快

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/557754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX