将递归函数拆分为两个或多个进程

时间:2017-05-23 16:27:20

标签: c# function math recursion parallel-processing

如何将G1(k-1,r)分成两个或多个进程?例如,G1(k-1,r)= G1(x1,x2)+ G1(x3,x4)。下面是原始的递归算法。

 private static int G1(int k, int r)
 {
    if (k == 0 || r == 0)
    {
        return 0;
    }

    if (s[k - 1] > r)
    {
        return G1(k - 1, r);
    }

    return Math.Max(G1(k - 1, r), p[k - 1] + G1(k - 1, r - s[k - 1]));
 }

我想做的事情:

private static int G2(int k, int r)
{
    if (k == 0 || r == 0) return 0;

    if (s[k - 1] > r) // this part gives the wrong results :(
    {
        Task<int> task1 = Task.Run(() => G1(k - 2, r));
        Task<int> task2 = Task.Run(() => G1(k - 3, r));
        return task1.Result + task2.Result;
    }

    Task<int> max1 = Task.Run(() => G1(k - 1, r));
    Task<int> max2 = Task.Run(() => p[k - 1] + G1(k - 1, r - s[k - 1]));

    return Math.Max(max1.Result, max2.Result);
}

1 个答案:

答案 0 :(得分:0)

看起来你要进行计算的并行化,而不是在单独的OS进程中进行拆分。您可以将Task和TPL用于此目的:

private static async Task<int> G1(int k, int r)
 {
    if (k == 0 || r == 0)
    {
        return 0;
    }

    if (s[k - 1] > r)
    {
        return await G1(k - 1, r);
    }

    var taskA = G1(k - 1, r);
    var taskB = G1(k - 1, r - s[k - 1]);

    await Task.WhenAll(taskA, taskB);

    return Math.Max(taskA.Result, p[k - 1] + taskB.Result);
 }

由于此处算法的目的不明确,以上假设计算本身是正确的。它只是回答并行化问题,而不是结果的正确性,或者需要同步访问共享状态的可能性。