繁体   English   中英

在此示例中,我如何只打印一次序列? (递归函数)

[英]in this example how do i print the sequence only once? (recursive function)

只是一个斐波那契算法,我如何打印每个斐波那契序列而不重复每个步骤?

递归函数在任何方面都很好用吗? 我知道它更清晰,但是如果我将n = 40放到这个简单算法中,就会有明显的延迟,而迭代的方式是瞬时的。

int fib(int n)
{   
    if (n == 0)
    {
        return 0;
    }
    else if (n == 1)
    {
        return 1;
    }

    return fib(n - 1) + fib(n - 2);
}

您可以通过记住已计算的值来轻松优化递归解决方案:

int fib(int n) {
    static int cache[48] = {0}; // should be enough to hold all int fibs
    if(n < 2) return n; // initial conditions
    else if(cache[n]) return cache[n]; // a value already computed and memoized
    else return cache[n] = fib(n - 1) + fib(n - 2); // the largest so far
}

应该以某种速度来加快计算速度。

像C这样的命令性语言并不总是能很好地映射到算法的功能定义。

非递归通常更快,因为编译器和处理器都可以更轻松地优化/并行化执行,并且您不会浪费精力,不必要地压入和弹出堆栈。 无论哪种方式,您需要的只是前两个fib值来计算下一个:

void PrintNFibs(unsigned n)
{
    size_t a = 1;
    size_t b = 1;
    size_t sum;
    printf("0\n1\n1\n");
    while ( n-- )
    {
        sum = a + b;
        printf("%zu\n", sum);
        a = b;
        b = sum;
    }
}

根据自身(递归)定义算法是一回事,而要在C语言中高效地实现则是另一回事。但是,对于像Fibonacci这样简单的事情,我不会使用递归,但是无论如何,这是一回事:

void PrintNFibsR(unsigned n)
{
    static size_t a = 0;
    static size_t b = 1;
    static size_t sum;
    sum = a + b;

    if ( a == 0 )
    {
        printf("0\n1\n");
    }

    printf("%zu\n", sum);
    if ( n > 1 )
    {
        a = b;
        b = sum;
        PrintNFibsR(n - 1);
    }
}

注意,我们在这里真正要做的就是传递循环计数器。 浪费但从技术上讲是递归的,即使实际上不起作用。 编写看起来像递归Fibonacci算法定义的C代码的问题是,它没有充分的理由就消耗了能量和堆栈空间。 您可以按正确的顺序打印值而无需事先计算和存储每个值的唯一方法是更改​​算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM