这个Fibonacci函数有什么问题?

时间:2011-07-07 00:51:04

标签: c fibonacci

在博客文章中偶然发现了这个糟糕的C ++代码示例,没有任何解释为什么它被认为是“坏”。我有自己的想法,但希望听到有经验的C ++开发人员。

unsigned int Fibonacci (unsigned int n)
{
    if (n == 0 || n == 1)
        return n;
    else
        return Fibonacci (n - 1U) + Fibonacci (n - 2U);
}

5 个答案:

答案 0 :(得分:7)

也许是因为它以指数时间运行?

答案 1 :(得分:7)

详细说明上述陈述:由于你没有记忆,你在第一次调用时产生2个进程,每个进程产生两个进程,依此类推,直到你遇到基本情况。

避免这种情况的三种方法:1)记忆,2)迭代地进行,或3)对Fibonacci序列使用闭合形式方程。 :d

答案 2 :(得分:4)

Fibonnacci(n)的大多数值计算两次。

例如,Fibonacci(5)调用Fibonacci(4)和 Fibonacci(3)

斐波那契(4)又称​​斐波那契(3)和斐波那契(2)。

看看这个例子中的Fibonacci(3)是如何被调用两次的?这就是memoize有用的地方,但算法虽然有趣且递归,但效率不高。最好使用更有效的算法而不是记忆效率低的算法。

答案 3 :(得分:2)

指数运行时间(甚至可能是超指数 - 就像在这种情况下一样)如果你有永恒等待程序结束,那就太可以了。

但世界上没有任何东西可以处理指数内存消耗 - 特别是指数程序堆栈消耗(由于递归的指数深度)。由于堆栈溢出且输入数量足够大,该程序将崩溃。

它不像“递归是邪恶的”。 如果递归的深度受某个小值的限制(例如,如果它是输入大小的对数或不大于sizeof(int)或其他东西),则递归是可接受的。但不是与输入值n成比例。

答案 4 :(得分:1)

有些人会说它很糟糕,因为它使用递归或因为它没有记忆就使用它,这是非常合理的,因为有些方法只使用迭代并保存将在辅助变量中重复的值,其他将指向事实它可以使用Binet的公式计算,达到一定的精度。

其他人会说它是多个返回点,更奇怪的是有人可能会说这很糟糕,因为其他是多余的,可以删除以保存一行。