javascript

每日一练---codewars 2

2020-08-05  本文已影响0人  即将牛逼的蛋蛋

这是一个斐波那契数列 F(n) 不过需要计算的是 F(n) * F(n + 1) 的值 与目标值比较 如果相等那就true 并且返回两个 F(n) * F(n + 1) 的值 以及相等于否(Boolean)
题目难度:4kyu

根据推演得出一个规律

// 规律: 从第二项开始(1,1,2,3,5.....),每个偶数项的平方都比前后两项之积多1,每个奇数项的平方都比前后两项之积少1。
//  已知其中一个 F(n) 的值 得出前后的值 并且能知道当前数值 是奇数项还是偶数项  但具体的数项不知道  可以通过递归不断的往前递推 得出
function F(n, ac1 = 0, ac2 = 1) {
    if (n <= 1) {
        return ac2
    }
    return F(n - 1, ac2, ac1 + ac2)
}
const oddVal = ( Math.sqrt( 5 * F(n) * F(n) - 4 ) - F(n) ) / 2
const evenVal = ( Math.sqrt( 5 * F(n) * F(n) + 4 ) - F(n) ) / 2
F(n-1) = Math.floor(evenVal) == evenVal ? evenVal : oddVal
F(n + 1) = F(n-1) + F(n)

解题思路

// 斐波那契数列
function F(n, ac1 = 0, ac2 = 1) {
    if (n <= 1) {
        return ac2
    }
    return F(n - 1, ac2, ac1 + ac2)
}

function productFib(prod) {
    // var flag = Math.floor(Math.sqrt(prod))
    var n = 0
    while (F(n) * F(n + 1) < prod) {
        n += 1;
    }
    return [F(n), F(n + 1), F(n) * F(n + 1) == prod]
}

console.log(productFib(5895))

代码优化: 可以把求斐波那契数列的值 放到 while 循环当中,减少函数调用 最终版!

function productFib(prod) {
    // var flag = Math.floor(Math.sqrt(prod))
    var n = 0
    var nPlus = 1
    while (n * nPlus < prod) {
        nPlus = n + nPlus;
        n = nPlus - n
    }
    return [n, nPlus, n * nPlus == prod]
}
console.log(productFib(5895))
上一篇 下一篇

猜你喜欢

热点阅读