【问题标题】:Recursive Caching Based Fibonacci基于递归缓存的斐波那契
【发布时间】:2016-11-20 18:51:58
【问题描述】:

我正在尝试实现基于缓存的斐波那契序列。但是它给了我错误的输出,例如(fibcache(8)给了我13而不是21的答案。但是在某些情况下它给了我正确的输出。例如fibcache(6)给了我8。不知道出了什么问题

#include <stdio.h>
#include <stdlib.h>
#define DCACHE_SIZE 5

int fibcache(int number);
long cacheodd[DCACHE_SIZE] = {0};
long cacheeven[DCACHE_SIZE] = {0};
int i_odd, i_even;

int main(int argc, char *argv[])
{

    int fibNum = fibcache(6);

    printf("The Fibonacci number is %d\n", fibcache(fibNum));

}

int fibcache(int n)
{
    int result;

    if (n == 0) 
        return 0;
    if (n == 1)
     return 1;

    if(n%2==0)
    {
        if (cacheodd[i_odd] != 0) 
            result = cacheodd[i_odd];
        else
        {
            cacheodd[i_odd] = fibcache(n-1) + fibcache(n-2);
            result = cacheodd[i_odd];
        }
    }
    else
    if(n%2==1)
    {
        if (cacheeven[i_even] != 0) 
            result = cacheeven[i_even];
        else
        {
            cacheeven[i_even] = fibcache(n-1) + fibcache(n-2);
            result = cacheeven[i_even];
        }
    }
    return result;
}

【问题讨论】:

  • 你真的应该学习如何使用调试器:)
  • 我是 C 的新手。学习使用调试器在我的待办事项列表中 :)
  • @xTiraMissU 使用打印语句 :)
  • 提示:i_oddi_even 取什么值?

标签: c algorithm caching fibonacci


【解决方案1】:

你有一些问题:

  • 您实际上打印了fib(fib(6)),比fib(6) 大得多。

  • 您的缓存功能太复杂:为什么处理偶数和奇数的方式不同?您应该对大于缓存大小的数字进行特殊处理,并验证是否已计算缓存值。

这是一个更简单的版本:

#include <stdio.h>

#define DCACHE_SIZE 5

long fibcache(int number);
long fibcache_values[DCACHE_SIZE] = { 0 };

int main(void) {
    printf("List of Fibonacci numbers:\n");
    for (int i = 0; i < 47; i++) {
        printf("    fib(%d) = %ld\n", fibcache(i));
    }
    return 0;
}

long fibcache(int n) {
    if (n <= 0)
        return 0;
    if (n == 1)
        return 1;
    if (n < DCACHE_SIZE) {
        if (fibcache_values[n] != 0)
            return fibcache_values[n];
        else
            return fibcache_values[n] = fibcache(n - 1) + fibcache(n - 2);
    } else {
        return fibcache(n - 1) + fibcache(n - 2);
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2014-04-02
    • 2017-11-18
    • 2014-01-08
    • 2011-12-14
    • 2012-11-29
    • 2018-04-10
    • 2016-02-21
    相关资源
    最近更新 更多