/** * 使用循环得到斐波那契额数列数组 * @param {Number} num */ function Fibonacci(num){ if(num<1){ return [0] } else if(num==1){ return [1] }else{ // 初始化 前两项的值,准备循环 let i = 2, // 循环起点 f = 0,// F(n-2) s = 1 // F(n-1) let fn = 0 // F(n) let arr=[0,1] while (i <= num) { fn = f + s //F(n)=F(n-2)+F(n-1) i++ // 准备计算下一项 f = s // 更新F(n-2) s = fn //更新F(n-1) arr.push(fn) } return arr } }
function trampoline(fn) { return (...args) => { let result = fn(...args); while (typeof result === 'function') { result = result(); } return result; }; }
function fibonacci(count, a = 1, b = 1) { const acc = [];
function inner(count, a, b) { if (!count) { return acc; } acc.push(a);
console.log(count - 1, b, a + b) return () => inner(count - 1, b, a + b); }
return trampoline(inner)(count, a, b); }
console.log(fibonacci(100));
计算阶乘
使用递归
1 2 3 4 5 6 7 8
// 阶乘需要使用big Integer,否则无法演示爆栈的情况 function factorial(n) { if (n == 1n) return 1n; return n * factorial(n - 1n); } console.log( factorial(100000n) // 会爆栈 )
使用循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/** * 得到从1到n位的阶乘数组 * @param {BigInt} n 阶乘数组第n位 */ function factorial(n){ let rst=1n// 累乘的结果 let arr=[1]// 存储数列项的数组,第0位为1 // i:循环计数器;rst:累计计数器; for (let i = 1n; i <= n; i++) { rst=rst*i arr.push(rst) } return arr } console.log(factorial(100000n))