факториал n чисел с помощью c# лямбду..?

Прежде чем Вы продолжите свой подход, я кротко предложил бы, чтобы Вы отступили и рассмотрели, хотите ли Вы действительно хранить эти данные в таблице "Key-Value Pair". Я не знаю Ваше приложение, но мой опыт показал, что каждый раз я сделал то, что Вы делаете, позже мне жаль, что я не составил таблицу цветов, таблицу матрицы и таблицу размера.

Думают об ограничениях ссылочной целостности, если Вы проявляете подход пары "ключ-значение", база данных не может сказать Вам, когда Вы пытаетесь сохранить цветной идентификатор в поле

размера, Думают о выигрышах в производительности присоединения на таблице с 10 значениями по сравнению с универсальным значением, которое может иметь тысячи значений через несколько доменов. Насколько полезный индекс на Значении ключа, действительно собирающемся быть?

Обычно обоснование позади выполнения, что Вы делаете, состоит в том, потому что домены должны быть "определяемыми пользователем". Если это так, тогда даже я не собираюсь продвигать Вас к составлению таблиц на лету (хотя это - выполнимый подход).

Однако, если Ваше обоснование состоит в том, потому что Вы думаете, что будет легче справиться, чем несколько таблиц, или потому что Вы предполагаете пользовательский интерфейс обслуживания, который универсален для всех доменов, затем остановитесь и думайте действительно трудно перед продолжением.

6
задан RameshVel 15 September 2009 в 13:16
поделиться

3 ответа

Currently there's no recursion - that's the problem. You're just taking a sequence of numbers, and projecting each number to "itself * itself-1".

The simple and inefficient way of writing a factorial function is:

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));
}

Typically you then get into memoization to avoid having to repeatedly calculate the same thing. You might like to read Wes Dyer's blog post on this sort of thing.

22
ответ дан 8 December 2019 в 02:22
поделиться

Чтобы продолжить ответ Джона, вот как вы можете запомнить факториальную функцию, чтобы не пересчитывать все на каждом шаге:

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());

РЕДАКТИРОВАТЬ: на самом деле приведенный выше код неверен, потому что факториал вызывает факториал , а не 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());

С этим кодом факториал вызывается 10 раз, по сравнению с 55 раз в предыдущей версии

6
ответ дан 8 December 2019 в 02:22
поделиться

Я пытался придумать что-то похожее на функцию сканирования F #, но не смог, поскольку мой LINQ не очень

Вот мое чудовище:

//this is similar to the folowing F# code: 
//let result = [1..10] |> List.scan (fun acc n -> acc*n) 1

var result = 
    Enumerable.Range(1, 10)
        .Aggregate(new List<int>(new[] { 1 }),
                    (acc, i) => {
                            acc.Add(i * acc.Last());
                            return acc;
                        }
                   );

foreach(var num in result) Console.WriteLine("{0}",num);

Если кто-нибудь знает, есть ли на самом деле эквивалент функции сканирования F # в LINQ, который я пропустил, мне было бы очень интересно.

3
ответ дан 8 December 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: