在博客文章中偶然发现了这个糟糕的C ++代码示例,没有任何解释为什么它被认为是“坏”。我有自己的想法,但希望听到有经验的C ++开发人员。
unsigned int Fibonacci (unsigned int n)
{
if (n == 0 || n == 1)
return n;
else
return Fibonacci (n - 1U) + Fibonacci (n - 2U);
}
答案 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的公式计算,达到一定的精度。
其他人会说它是多个返回点,更奇怪的是有人可能会说这很糟糕,因为其他是多余的,可以删除以保存一行。