且不谈FP优化技术,如果n是个常量,在C++里可以写个模板在编译期直接搞定,算是优化到极致了吧域名空间。算是C++模板元编程(template meta-programming)技术的小试牛刀🐮。
template<int T> struct acc_ {
enum { result = N + acc_<N - 1>::result };
};
template<> struct acc_<0> {
enum { result = 0 };
};
使用:
int sum = acc_<1234>::result;
通过这种方式网络营销推广,acc_<1234>::result 会在编译时直接被替换为常量,无任何运行时开销优化技术。模板本身也不会产生任何额外二进制代码。
借助boost里的if_之类的广州百度推广,这个实现还能更简单优化技术。
当然优化技术,这个应该不是题主期望的答案,因为和FP无关。😌
我不知道题主这里说的FP语言具体指哪个,但是一般来讲,这样的求和,如果是递归求解的话,属于尾递归调用,会被编译器优化,不会导致任何额外的栈增长优化技术。n作为值类型,且是右值,往往是分配在栈上,而不是堆上,会随着栈的增减快速清除,并不存在GC的问题。 比如erlang:
acc(0) -> 0;
acc(N) when N > 0 -> N + acc(N - 1);
和C++模板的方式几乎一模一样(但这个是运行期求值),并不存在什么存储浪费和GC问题。
所以,如果严格的谈“编译优化技术”,基于以上,可以总结出两点:
编译期常量合并(constant folding, constant propagation);尾调用消除(tail-call elimination)。题外话,对于等差数列,可以直接用求和公式: f(n) = (1 + n) * n / 2