初尝“元编程”(C++描述)

先看两个计算斐波拉契数的程序:

(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;
}


(2)编译期

#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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值