gpt4 book ai didi

c# - 使用 PLINQ 计算阶乘的递归函数

转载 作者:行者123 更新时间:2023-11-30 22:22:47 24 4
gpt4 key购买 nike

注意 我很清楚我在问什么,而且在正常情况下我不可能需要使用这样的功能,但它被用作研究我正在进行的关于因子实验的研究生项目的因子。

我有以下函数,我想在其中使用 PLINQ(非 TPL)运行。我知道 PLINQ 运行在 TPL 之上,但这部分实验。此外,除非我不知道使用 PLINQ 的另一种方法,否则我相信我将不得不稍微“破解”阶乘方法以使用带递归的 for 循环。

由于 Parallel 类只提供了 For,ForEach 和 Invoke,它没有提供我需要的东西,比如 TPL 做了什么,我需要它返回,而 Invoke 不这样做,所以我将不得不使用 For 和做每次递归调用从 0,1 开始的 for 循环(是的,我知道这看起来很可笑)。

我想做如下的事情:

public ulong RecursivePLINQ(ulong factor)
{
if (factor > 1)
{
Parallel.For<ulong>(0, 1, () => factor, (j, loop, factorial) =>
{
Thread.Sleep(1); /*Simulate Moderate Operation*/
return factorial * RecursivePLINQ(--factorial);
}, (i) => { });
}


return 1;

}

目前,正在发生的事情似乎是有效的,但在最终调用时它返回 1,递归调用的结果是 1,而不是递归更改的值。我似乎无法发现什么是错的。我在这里展示了替代的 TPL 实现(再次用于研究),它正在运行。

public ulong RecursiveTPL(ulong factor)
{
if (factor > 1)
{
Task<ulong> task = new Task<ulong>((f) =>
{
Thread.Sleep(1); /*Simulate Moderate Operation*/
ulong val = (ulong)f;
return factor * RecursiveTPL(--val);
}, factor);
task.Start();
task.Wait();
return task.Result;
}
return 1;


}

***再一次,请不要因为我的问题而激怒我,这是为了一个非常具体的研究目的*****

编辑 我在 MSDN 文档上看到了一个示例,该示例显示了线程局部变量的使用,所以我尝试了类似的方法,但我的头开始有点旋转......不要注意类型转换,只是为了看看我是否能让它工作......

public ulong RecursivePLINQ(ulong factor)
{
long total = 0;
if (factor > 1)
{
Parallel.For<ulong>(0, 1, () => factor, (j, loop, factorial) =>
{
Thread.Sleep(1); /*Simulate Moderate Operation*/
return factorial * RecursivePLINQ(--factorial);
}, (i) => Interlocked.Add(ref total,(long)i)
);
}


return (ulong)total;

}

最佳答案

它不漂亮,我真的不确定这对我的目的是否有效,但它确实给了我正确的阶乘。我得到了这个解决方案,但我必须对总参数进行校正才能使其正常工作,不确定我会称之为什么,或者是否有更好的方法来做,但现在必须这样做。 ..

public long RecursivePLINQ(long factor,long total)
{

if(total == 0)
{
total = 1;
}
if (factor > 1)
{
Parallel.For<long>(0, 1, () => factor, (j, loop, factorial) =>
{
Thread.Sleep(1); /*Simulate Moderate Operation*/
total = factorial * RecursivePLINQ(--factorial, total);
return total;
}, (i) => {return;});
}
return total;
}

关于c# - 使用 PLINQ 计算阶乘的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com