如何将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);
}
答案 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);
}
由于此处算法的目的不明确,以上假设计算本身是正确的。它只是回答并行化问题,而不是结果的正确性,或者需要同步访问共享状态的可能性。