c# - 递归到动态函数

标签 c# algorithm recursion dynamic dynamic-programming

我正在尝试创建递归函数的动态函数,但我有点卡住了。

递归:

static int F(int m, int n)
    {
        if(n == 0)
            return m;

        if (m == 0 && n > 0)
            return n;

        else
            return Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m, n - 1)), (D(m-1, n-1) + F(m - 1, n - 1))));
    }

    static int D(int i, int j)
    {
        Console.WriteLine("i:{0} | j:{1}", i, j);
        if (x[i] == y[j])
        {
            return 1;
        }
        return 0;
    }

动态的(到目前为止我所拥有的):

static int F2(int m, int n)
    {
        if (n == 0)
        {
            return m;
        }
        if(m==0 && n > 0)
        {
            return n;
        }
        else
        {
            //Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m, n - 1)), (D(m-1, n-1) + F(m - 1, n - 1))));
        }
    }

问题是有人可以向我解释如何转换此 Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m , n - 1)), (D(m-1, n-1) + F(m - 1, n - 1)))); 编码成动态?我对递归有点陌生。

最佳答案

在动态规划方法中,您将使用一个二维查找表,您可以通过这种方式填充您始终拥有所需的所有可用数据。

由于 mn 的递归取决于 F(m - 1, n)F(m, n - 1)F(m - 1, n - 1),您需要做的就是确保在开始计算 F(m , n)。例如:

static int F2(int M, int N) {
    var F = new int[M + 1, N + 1];

    for (var m = 0; m <= M; m++) {
        for (var n = 0; n <= N; n++) {
            if (n == 0) {
                F[m, n] = m;
                continue;
            }
            if (m == 0 && n > 0) {
                F[m, n] = n;
                continue;
            }
            F[m, n] = Math.Min((1 + F[m - 1, n]), Math.Min((1 + F[m, n - 1]), (D(m-1, n-1) + F[m - 1, n - 1])));
        }
    }

    return F[M, N];
}

我选择这些名称是为了最容易看出它是如何映射到递归方法的。

关于c# - 递归到动态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164978/

相关文章:

algorithm - 有效的多重搜索算法

javascript - 如何在 javascript 中获取不同深度的 JSON 对象的大小?

c# - 当两个实体可以独立存在时, Entity Framework 核心一对零或一

c# - 尝试运行项目时出错 : Unable to start program. 请求不受支持

c# - 如何获取指向接口(interface)的指针?

c# - 服务器模式 SSL 必须使用具有关联私钥的证书 - 在 TLS 握手期间

algorithm - 找出绳子的最小长度

.net - 当 “sides” 都是数字时,如何将字母数字值排序为数字?

algorithm - 如何阻止惰性求值减慢分而治之算法的速度

algorithm - 是否存在任何可用的种子 AI