每日一练---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)
解题思路
- 首先要完成一个斐波那契数列 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))