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.哈希映射承诺不断搜索时间(虽然没有指定常量的值:)),所以你也可能试一试.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...