两种优化函数递归的方法

256 篇文章 3 订阅
149 篇文章 2 订阅
#include <iostream>
#include <unordered_map>
#include <functional>
#include <memory>
#include <map>
template <typename R, typename... Args>
std::function<R(Args...)> cache(R(*func) (Args...)) {
    auto result_map = std::make_shared<std::map<std::tuple<Args...>, R>>();     // key -- 函数参数列表 value -- 函数返回值
    return ([=] (Args... args) {
        std::tuple<Args...> t(args...);
        if (result_map->find(t) == result_map->end()) {
            (*result_map)[t] = func(args...);
        }
        return (*result_map)[t];
    });
}

template <typename R, typename...  Args>
std::function<R(Args...)> sugar(R(*func)(Args...), bool needClear = false) {
    using function_type = std::function<R(Args...)>;
    static std::unordered_map<decltype(func), function_type>functor_map;
    if (needClear) {
        return functor_map[func] = cache(func);
    }
    if (functor_map.find(func) == functor_map.end()) {
        functor_map[func] = cache(func);
    }
    return functor_map[func];
}
size_t fibonacci(size_t n) {
    return (n < 2) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
size_t fibonacci1(size_t n) {
    if (n < 2) {
        return n;
    }
    int a = 0;
    int b = 1;
    int c = 0;
    for (int i = 2;i <= n;i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}
size_t fibonacci2(size_t n) {
     return (n < 2) ? n : sugar(fibonacci2)(n - 1) + sugar(fibonacci2)(n - 2);
}
int main() {
    //size_t n = fibonacci(45);           // 5.883s
    //size_t n = fibonacci1(45);          // 0.005s
    size_t n = fibonacci2(45);            // 0.006s
    std::cout << n << std::endl;

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值