每日一练---codewars 2

这是一个斐波那契数列 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)

解题思路

  • 首先要完成一个斐波那契数列 F(n)
  • 陷入瓶颈 :是根据给定的数值去依次计算 现在需要知道值 计算需要计算的次数
  • 转变思路 我使用 while 循环去计算 每次 n+=1 然后计算 F(n) + F(n + 1) 的值 直到值 大于 给定的值 停止 while 循环
// 斐波那契数列
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))

你可能感兴趣的:(每日一练---codewars 2)