C# 中的并行递归


    class CustomData
    {
       public int TNum;
       public int TResult;
    }
    public static int F_recursion(int n, int w)
    {
        if (n == 0 || w == 0)
            return 0;
        else if (s[n] > w)
            return F_recursion(n - 1, w);
        else
        {
            return Math.Max(F_recursion(n - 1, w),
                p[n] + F_recursion(n - 1, w - s[n]));
        }
    }
    public static int F_recursion2(int n, int w)
    {
        int numba = 0;
        int countCPU = 8;
        Task[] tasks = new Task[countCPU];
          for (var j = 0; j < countCPU; j++)
            tasks[j] = Task.Factory.StartNew(
               (object p) =>
               {
                 var data = p as CustomData; if (data == null) return;
                   data.TResult = F_recursion(n - data.TNum, w);
               },
            new CustomData() { TNum = j });
          Task.WaitAll(tasks);
          numba = (tasks[0].AsyncState as CustomData).TResult
          + (tasks[1].AsyncState as CustomData).TResult
          + (tasks[2].AsyncState as CustomData).TResult
          + (tasks[3].AsyncState as CustomData).TResult;
        return numba;
    }

如何使F_recursion2方法并行工作?使用我的代码当前结果是

Time in milliseconds for recursion:  1,075
recursion(  150 ) =     7,237
Time in milliseconds for parallel recursion:  1,581
recursion(  150 ) =    28,916

如您所见,并行方法打印的数字是其 4 倍,并且需要更多时间来计算,这没有意义。我怎样才能解决递归并行工作的问题?

编辑 更改为Parallel.For循环,结果仍然与上面相同。

    public static int F_recursion2(int n, int w)
    {
        int numba = 0;
        int countCPU = 8;
        Task[] tasks = new Task[countCPU];
        Parallel.For(0, countCPU, j =>
       {
           tasks[j] = Task.Factory.StartNew(
              (object p) =>
              {
                  var data = p as CustomData; if (data == null) return;
                  data.TResult = F_recursion(n - data.TNum, w);
              },
           new CustomData() { TNum = j });
       });
        Task.WaitAll(tasks);
        numba = (tasks[0].AsyncState as CustomData).TResult
        + (tasks[1].AsyncState as CustomData).TResult
        + (tasks[2].AsyncState as CustomData).TResult
        + (tasks[3].AsyncState as CustomData).TResult;
        return numba;
    }
我想

到的解决方案是使用Parallel.For。为此,您应该使用 Parallel.For 实现for。要查看示例,请访问此处。

最新更新