如何使用具有O(n)复杂度的Javascript找到第n个Fibonacci数

时间:2018-01-08 12:29:35

标签: javascript python algorithm time-complexity fibonacci

很难弄清楚如何解决这个问题。问题是使用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来解决这个问题呢?

提前致谢

6 个答案:

答案 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)

问题与k变量的范围有关。它必须在函数内部:

const fib = (n) => {
    let k;

您可以在list

找到更多优秀的实施方案

DEMO

答案 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]
}