我刚开始玩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)
这是我使用的程序
我知道我搞砸了某个地方.谁能告诉我什么是错的以及任何其他可能的解决方案.
编辑:
我打算让这个线程打开一段时间......因为这是我迈向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关于此类事情的博客文章.
虽然这里没有递归但很简单:
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)
只是继续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次
| 归档时间: |
|
| 查看次数: |
5741 次 |
| 最近记录: |