先看两个计算斐波拉契数的程序:
(1)运行时
#include <iostream>
using namespace std;
const int N = 45;
int Fib(unsigned n)
{
if (0 == n) return 0;
if (1 == n) return 1;
return Fib(n - 1) + Fib(n - 2);
}
int main(int argc, char **argv)
{
cout << Fib(N) << endl;
return 0;
}
#include <iostream>
using namespace std;
const int N = 45;
template<unsigned N>
struct Fib {
enum {
RESULT = Fib<N - 1>::RESULT + Fib<N - 2>::RESULT
};
};
template<>
struct Fib<1> {
enum {
RESULT = 1
};
};
template<>
struct Fib<0> {
enum {
RESULT = 0
};
};
int main(int argc, char **argv)
{
cout << Fib<N>::RESULT << endl;
return 0;
}
核心汇编代码
013013C8 68 82 3F A5 43 push 43A53F82h
而43A53F82h(十六进制)正是Fib(45),编译期间已得出结果。
第一个程序是指数型的时间复杂度,很慢。第二个程序看起来类似,但它是在编译时递归完成的,编译+运行几乎不耗时间。
我有些疑惑的是,
1、怎么评价第二个程序的时间复杂度?它凭什么能“赚取”效率?这让我想到了排序中的“计数排序”与基于比较的排序,它们的出发点(思想)是不一样的,因此在某些情况下会带来革命性的高效!
想想有些人,如果始终在思想上放不开,那真的很难提高,如果换个角度看,可能又是一片天地。
2、把元编程的技术用在ACM上怎么样?
参考资料:http://www.doc88.com/p-418478822377.html