微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 将此递归函数转换为迭代

如何将此递归函数转换为迭代函数
#include <cmath>

int M(int H,int T){
    if (H == 0) return T;
    if (H + 1 >= T) return pow(2,T) - 1;
    return M(H - 1,T - 1) + M(H,T - 1) + 1;
}

嗯,它是一个3行代码,但我很难将其转换为迭代函数.因为它有2个变量.我对Stacks一无所知,所以我无法转换它.

我这样做的目的是提高功能的速度.这个功能太慢了.我想使用map来加快速度,但我有3个变量M,H和T所以我无法使用map

解决方法

这个函数速度慢的主要原因是因为它具有指数复杂性,并且它一次又一次地重新计算相同的成员.一种可能的治疗方法是记忆模式(用C here中的例子轻松解释).我们的想法是将每个结果存储在具有快速访问权限的结构中(例如,数组),并且每次需要它时,检索已经预先计算的结果.当然,这种方法受到你的记忆大小的限制,所以它不适用于极大的数字……

在你的情况下,我们可以做类似的事情(保持递归但记住结果):

#include <cmath>
#include <map>
#include <utility>

std::map<std::pair<int,int>,int> MM;

int M(int H,int T){
    std::pair<int,int> key = std::make_pair(H,T);
    std::map<std::pair<int,int>::iterator found = MM.find(key);
    if (found!=MM.end()) return found->second; // skip the calculations if we can
    int result = 0;
    if (H == 0) result = T;
    else if (H + 1 >= T) result = pow(2,T) - 1;
    else result = M(H - 1,T - 1) + 1;
    MM[key] = result;
    return result;
}

关于时间复杂度,C映射是树映射,因此在那里搜索N * log(N)的顺序,其中N是映射的大小(已经计算的结果的数量).还有C的哈希映射,它们是STL的一部分,但不是标准库的一部分,因为已经是mentioned on SO.哈希映射承诺不断搜索时间(虽然没有指定常量的值:)),所以你也可能试一试.

原文地址:https://www.jb51.cc/c/117499.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐