使用c#lambda的n个数的阶乘...?

Ram*_*Vel 6 c# linq lambda

我刚开始玩lambdas和Linq表达自学.我为此采取了简单的因子问题.在一个复杂的小场景中,找到给定n个数的阶乘(无需使用递归循环).

在我试过的代码下面.但这不起作用.

public void FindFactorial(int range)
{

    var res = Enumerable.Range(1, range).Select(x => Enumerable.Range(0, x).Where(y => (y > 1)).Select(y => y * (y-1)));            
    foreach (var outt in res)
        Console.WriteLine(outt.ToString());

}
Run Code Online (Sandbox Code Playgroud)

这是我使用的程序

  • 循环数字1到n - Enumerable.Range(1,range).
  • 选择每个数字x并再次循环它们x次(而不是递归)
  • 并选择其中(y =>(y> 1))大于1的数字并将其与(y-1)相乘

我知道我搞砸了某个地方.谁能告诉我什么是错的以及任何其他可能的解决方案.

编辑:

我打算让这个线程打开一段时间......因为这是我迈向lambda的最初步骤..我发现所有的答案都非常有用且信息丰富..而且它会变得有趣而且很好学习看到不同的接近方式这个问题.

Jon*_*eet 22

目前没有递归 - 这就是问题所在.你只是采用一系列数字,并将每个数字投射到"本身*本身-1".

编写阶乘函数的简单而低效的方法是:

Func<int, int> factorial = null; // Just so we can refer to it
factorial = x => x <= 1 ? 1 : x * factorial(x-1);

for (int i = 1; i <= range; i++)
{
    Console.WriteLine(factorial(i));
}
Run Code Online (Sandbox Code Playgroud)

通常,您会进入memoization以避免重复计算相同的事情.您可能想阅读Wes Dyer关于此类事情的博客文章.

  • 10个十分之一的样式仅仅用于"x => x <= 1?1:x*factorial(x-1);"... x => x <= 1 :) (3认同)
  • 男人......我觉得自己像个白痴.我不得不去维基百科并查找Memoization.我拥有Comp Sci学位,而且在今天之前我从未听说过这个词.谢谢你教我一些东西. (2认同)

Glu*_*uip 8

虽然这里没有递归但很简单:

public static int Factorial(this int count)
{
        return count == 0
                   ? 1
                   : Enumerable.Range(1, count).Aggregate((i, j) => i*j);
}

3.Factorial() == 6
Run Code Online (Sandbox Code Playgroud)


Tho*_*que 6

只是继续Jon的回答,这里是你如何记住阶乘函数,这样你就不会在每一步重新计算所有内容:

public Func<T, TResult> Memoize<T, TResult>(Func<T, TResult> func)
{
    Dictionary<T, TResult> _resultsCache = new Dictionary<T, TResult>();
 return (arg) =>
 {
     TResult result;
     if (!_resultsCache.TryGetValue(arg, out result))
  {
   result = func(arg);
   _resultsCache.Add(arg, result);
  }
  return result;
 };
}

...

Func<int, int> factorial = null; // Just so we can refer to it
factorial = x => x <= 1 ? 1 : x * factorial(x-1);
var factorialMemoized = Memoize(factorial);
var res = Enumerable.Range(1, 10).Select(x => factorialMemoized(x));
foreach (var outt in res)
    Console.WriteLine(outt.ToString());
Run Code Online (Sandbox Code Playgroud)

编辑:实际上上面的代码是不正确的,因为factorial调用factorial,而不是factorialMemoized.这是一个更好的版本:

Func<int, int> factorial = null; // Just so we can refer to it
Func<int, int> factorialMemoized = null;
factorial = x => x <= 1 ? 1 : x * factorialMemoized(x-1);
factorialMemoized = Memoize(factorial);
var res = Enumerable.Range(1, 10).Select(x => factorialMemoized(x));
foreach (var outt in res)
    Console.WriteLine(outt.ToString());
Run Code Online (Sandbox Code Playgroud)

使用该代码,factorial被调用10次,而前一版本被调用55次