【发布时间】:2017-07-27 03:09:22
【问题描述】:
我写了一个递归函数,但是当我输入一个很大的数字,比如100时,递归需要很多时间。
我想在代码中应用尾调用优化,以最小化计算时间,但我做不到。
递归算法是f(n) = f(n-1) + f(n-2)
int fib(int n)
{
if (n == 1) return n;
if (n == 0) return n;
return fib(n - 1) + fib(n - 2);
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "---->" << fib(3);
std::system("PAUSE");
return 0;
}
【问题讨论】:
-
这是一个 XY 问题。您实际上是在计算斐波那契数,但您使用的是指数算法(约
O(2^n)) -
fac对你的函数来说是一个糟糕的名字。你不是在计算阶乘。您正在评估斐波那契数。 -
为了好玩,我写了一个尾递归斐波那契函数:godbolt.org/g/N8TrPc
-
这是一个高效的尾递归斐波那契函数:godbolt.org/g/U9HfY8
-
@venaizu 第 8181 个斐波那契数有 1709 个十进制数字(5679 个二进制数字),所以你的朋友一定使用了一些任意精度整数的实现。写一个;这比计算斐波那契数要有趣得多。