使用先前声明的变量在fib序列javascript中查找第n个值
find nth value in fib sequence javascript using previously declared variables
我试图在javascript中找到fib序列的第n个值,但在此之前我遇到了另一个问题,我正在努力理解原因。
function nthFib(n) {
var fib = [0, 1];
var l = fib[fib.length-1];
var s = fib[fib.length-2];
while(fib.length < n) {
fib.push(fib[fib.length-1] + fib[fib.length-2]);
}
console.log(fib);
}
nthFib(5);
现在,当我控制台日志时,我得到了我想要的,即阵列构建:[0,1,1,2,3]
但如果我在while循环中这样做,以获得更干净的代码:
while(fib.length < n) {
fib.push(s + l);
}
我想我的while循环无法访问这些变量,然后我得到了这样的结果:[0,1,1,1]
为什么?
我认为这是一个更好的函数,因为它使用了具有适当尾部递归的线性迭代过程
function fib(n) {
function iter(xs, i, a, b) {
if (i === 0) return xs;
return iter(xs.concat(b), i-1, b, a+b);
}
return iter([0], n, 0, 1);
}
示例
fib(0);
//=> [ 0 ]
fib(1);
//=> [ 0, 1 ]
fib(2);
//=> [ 0, 1, 1 ]
fib(3);
//=> [ 0, 1, 1, 2 ]
fib(4);
//=> [ 0, 1, 1, 2, 3 ]
fib(5);
//=> [ 0, 1, 1, 2, 3, 5 ]
fib(6);
//=> [ 0, 1, 1, 2, 3, 5, 8 ]
fib(10);
//=> [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ]
解释
iter
函数采用4个状态变量
xs
-fib级数,用[ 0 ]
初始化i
-用于终止递归的递减迭代器,用n
初始化a
-第一个fib编号,用0
初始化b
-第二个fib编号,用1
初始化
其工作方式是,一旦i
到达0
,就会返回xs
。
让我们看看fib(5)
是如何计算的
// xs i a b
// -----------------------------
iter([0], 5, 0, 1);
iter([0,1], 4, 1, 1);
iter([0,1,1], 3, 1, 2);
iter([0,1,1,2], 2, 2, 3);
iter([0,1,1,2,3], 1, 3, 5);
iter([0,1,1,2,3,5], 0, 5, 8);
// -----------------------------
//=> [0,1,1,2,3,5]
ES6
使用带有ES6的U组合子,您可以获得相同函数的精简版本
// ES6
let fib = n => (
f => f(f, [0], n, 0, 1)
)(
(f, xs, i, a, b) => i === 0 ? xs : f(f, xs.concat(b), i-1, b, a+b)
);
fib(10);
//=> [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ]
酷!
您必须在while循环中修改s, l
。看看这个代码。
function nthFib(n) {
var fib = [0, 1];
while(fib.length < n) {
var l = fib[fib.length-1];
var s = fib[fib.length-2];
fib.push(s + l);
}
console.log(fib);
}
nthFib(5);
相关文章:
- 如何使用JavaScript中的用户输入创建序列/序列
- 使用JavaScript或jQuery创建序列步骤[动画]
- Javascript替换字节数组序列
- 是否可以在javascript中反序列化java对象
- 对象序列化,JAVA,Javascript
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 在html标记中序列化javascript代码
- 斐波那契序列Javascript做while循环
- XQuery 序列等效于 MarkLogic 服务器端 JavaScript
- 用Javascript编辑范围数据(时间序列)
- JavaScript 序列器中的计时
- Javascript 序列化和性能与 V8 和 PostgreSQL
- C#到JavaScript序列化问题
- JavaScript序列化和方法
- Javascript序列与函数调用数组
- PHP反序列化Javascript序列化字符串
- JavaScript序列化无法正常工作
- Javascript序列化数组多个表单问题
- 转义 Javascript 序列的最简单方法是什么,如果嵌入到 HTML 代码的脚本标签中,会导致不需要的功能
- Javascript序列化映射对象