很难弄清楚如何解决这个问题。问题是使用javascript找到具有O(n)复杂度的第n个Fibonacci。
我发现很多很棒的文章如何使用C ++或Python来解决这个问题,但每次我尝试实现相同的逻辑时,我都会在Maximum call stack size exceeded
中找到它。
Python中的示例代码
MAX = 1000
# Create an array for memoization
f = [0] * MAX
# Returns n'th fuibonacci number using table f[]
def fib(n) :
# Base cases
if (n == 0) :
return 0
if (n == 1 or n == 2) :
f[n] = 1
return (f[n])
# If fib(n) is already computed
if (f[n]) :
return f[n]
if( n & 1) :
k = (n + 1) // 2
else :
k = n // 2
# Applyting above formula [Note value n&1 is 1
# if n is odd, else 0.
if((n & 1) ) :
f[n] = (fib(k) * fib(k) + fib(k-1) * fib(k-1))
else :
f[n] = (2*fib(k-1) + fib(k))*fib(k)
return f[n]
// # Driver code
// n = 9
// print(fib(n))
然后尝试将其移植到Javascript
const MAX = 1000;
let f = Array(MAX).fill(0);
let k;
const fib = (n) => {
if (n == 0) {
return 0;
}
if (n == 1 || n == 2) {
f[n] = 1;
return f[n]
}
if (f[n]) {
return f[n]
}
if (n & 1) {
k = Math.floor(((n + 1) / 2))
} else {
k = Math.floor(n / 2)
}
if ((n & 1)) {
f[n] = (fib(k) * fib(k) + fib(k-1) * fib(k-1))
} else {
f[n] = (2*fib(k-1) + fib(k))*fib(k)
}
return f[n]
}
console.log(fib(9))
这显然不起作用。在Javascript中,这最终会出现无限循环。那你怎么用Javascript来解决这个问题呢?
提前致谢
答案 0 :(得分:1)
你可以从下到上迭代(如尾递归):
from django.db.models import Q, Case, Value, IntegerField
TokenCollection.objects.filter(
Q(title__istartswith=query) | Q(title__icontains=query)
).annotate(
c=Case(
When(title__istartswith=query, then=Value(1)),
When(title__icontains=query, then=Value(2)),
output_field=IntegerField())
).order_by('c')

答案 1 :(得分:1)
答案 2 :(得分:1)
O(n)时间和O(1)空间复杂度的斐波那契数:
function fib(n) {
let prev = 0, next =1;
if(n < 0)
throw 'not a valid value';
if(n === prev || n === next)
return n;
while(n >= 2) {
[prev, next] = [next, prev+next];
n--;
}
return next;
}
答案 3 :(得分:0)
只需使用两个变量和一个循环来减少所提供的数字。
function fib(n){
let [a, b] = [0, 1];
while (--n > 0) {
[a, b] = [b, a+b];
}
return b;
}
console.log(fib(10));
答案 4 :(得分:0)
这是使用迭代或递归方法的一种简单方法:
function FibSmartRecursive(n, a = 0, b = 1) {
return n > 0 ? FibSmartRecursive(n-1, b, a+b) : a;
}
function FibIterative(n) {
if (n < 2) return n;
var a = 0, b = 1, c = 1;
while (--n > 1) {
a = b;
b = c;
c = a + b;
}
return c;
}
function FibMemoization(n, memo = {}) {//could use [] as well here
if (n < 2) return n;
if (memo[n]) return memo[n];
return memo[n] = FibMemoization(n-1, memo) + FibMemoization(n-2, memo);
}
console.log(FibMemoization(25)); //75025
console.log(FibIterative(25)); //75025
console.log(FibSmartRecursive(25)); //75025
答案 5 :(得分:0)
你可以不用递归来解决这个问题,使用循环,运行时 O(n):
function nthFibo(n) {
// Return the n-th number in the Fibonacci Sequence
const fibSeq = [0, 1]
if (n < 3) return seq[n - 1]
let i = 1
while (i < n - 1) {
seq.push(seq[i - 1] + seq[i])
i += 1
}
return seq.slice(-1)[0]
}