先完成代码。我给你递归方程:
fib(0) = *deleted*
fib(1) = *deleted*
fib(n) = *deleted*
您的计数器(您仍应在问题中指定)通常可以通过在函数外部定义但在函数内更改的全局变量来实现。
参考问题的编辑:
你的号码不好。为了不破坏你的任务,我在 Erlang 中给你答案,所以你还有一些工作要弄清楚如何在你的 C++ 任务中正确地完成它。:-)
-module(fib).
-export([f/1]).
%% returns a tupel { fibonacci value, number function calls }
f(0) -> {0, 1};
f(1) -> {1, 1};
f(X) ->
{F1, C1} = f(X - 1), %% decompose tuple
{F2, C2} = f(X - 2),
{F1 + F2, C1 + C2}. %% return value
从 shell 运行它会给出:
Eshell V5.10.1 (abort with ^G)
1> c("q:/doc/erlang/fib", [{outdir, "q:/doc/erlang/"}]).
{ok,fib}
2> fib:f(0).
{0,1}
3> fib:f(1).
{1,1}
4> fib:f(2).
{1,2}
5> fib:f(3).
{2,3}
6> fib:f(4).
{3,5}
7> fib:f(5).
{5,8}
8> fib:f(6).
{8,13}
9> fib:f(7).
{13,21}
10> fib:f(15).
{610,987}
11>
因此我得到了 987 个函数调用来获得 F(15) = 610 的值。
这里有趣的一点是,在评论中我们谈到了斐波那契递归 F 的正确开始条件(情况类似于微分方程,不同的起点让您获得不同的轨迹/解决方案)。
我弄错了 F(0) = 1 和 F(1) = 1,而 @WhozCraig 正确指出它应该是 F(0) = 0 和 F(1) = 1。
如果您查看上面的 Erlang 代码,您会看到产生函数调用次数的系列的计算也是斐波那契类型之一(添加系列的最后两个成员),但那个是开头的那个值 1 和 1!:-)