這是可以找出數學。但是如果你想用經驗來衡量它,你可以在函數中使用一個靜態計數器。這個邏輯很容易擴展到計數添加的數量。
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