这是可以找出数学。但是如果你想用经验来衡量它,你可以在函数中使用一个静态计数器。这个逻辑很容易扩展到计数添加的数量。
int mystery(int n) {
static int invocations = 1;
cout << "mystery has been invoked " << invocations++ << " times.\n";
if (n == 0 || n == 1 || n == 2) {
return n ;
}
return (mystery(n-1) + mystery(n-2) + mystery(n-3)) ;
}
您也可以使用全局变量。尽管我不喜欢这两种解决方案。他们很难做到多线程,并且违反了一些重要的设计原则。作为一个一次性的来回答这个问题,然后从你的代码,他们是很好,但如果我想这是一个永久性的功能,我会做删除是这样的:
#include <iostream>
class counted_mystery {
public:
counted_mystery() : invocations_(0), additions_(0) { }
unsigned int getInvocations() const { return invocations_; }
void resetInvocations(unsigned int newval = 0) { invocations_ = newval; }
unsigned int getAdditions() const { return additions_; }
void resetAdditions(unsigned int newval = 0) { additions_ = newval; }
operator()(int n) {
++invocations_;
counted_mystery &mystery = *this;
if (n == 0 || n == 1 || n == 2) {
return n ;
}
// The code is about to perform two additions.
additions_ += 2;
return (mystery(n-1) + mystery(n-2) + mystery(n-3));
}
private:
unsigned int count_, additions_;
};
int main(int argc, char *argv[])
{
using ::std::cout;
counted_mystery mystery;
mystery(20);
cout << "mystery was called " << mystery.getCount() << " times for n == 20\n";
return 0;
};
搞清楚了这一点的数学是有趣的问题,但可能不会太难。我认为它会变成指数级的。
顺便说一句,不要使用endl
除非这是你的意思使用。这是非常缓慢的,因为无论何时使用它都会强制缓冲区刷新。使用'\n'
。
对于每个打印出来的n> 2,有3个补充。没有? – Falmarri 2011-03-18 00:52:08
除了递归固有的开销之外,请注意'mystery(n-1)'的调用已经计算了值,这些值将在'mystery(n-2)'的调用中重新计算,并且再次重新计算在电话“神秘(n-3)”中。这意味着糟糕可怕的表现。阅读关于动态编程。 – wilhelmtell 2011-03-18 00:55:14
@wilhelmtell - 我的猜测是,这是作业的一部分,他们将学习如何计算添加次数。所以使用动态编程来摆脱它们将会破坏目的。 – Omnifarious 2011-03-18 01:10:56