Je viens de commencer à jouer avec Lambdas et Linq Expression pour l'auto-apprentissage. J'ai pris le problème factoriel simple pour cela. Avec le scénario peu complexe où trouver le facteur factoriel pour n chiffres (witout à l'aide de boucles récursives).
ci-dessous le code que j'ai essayé. Mais cela ne fonctionne pas. P>
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()); }
Je sais que j'ai foiré quelque part. Peut-on me dire ce qui ne va pas et une autre solution possible. P>
EDIT: strong> p> Je vais laisser ce fil ouvert pendant un certain temps ... Ceci est mes premiers pas vers Lambda .. J'ai trouvé toutes les réponses très utiles et informatives .. Et c'est amusant et d'excellent apprendre à voir les différentes manières d'approcher ce problème. P> P>
4 Réponses :
Actuellement, il n'y a pas de récursion - c'est le problème. Vous venez de prendre une séquence de chiffres et de la projection de chaque numéro à «elle-même * elle-même-1».
La manière simple et inefficace d'écrire une fonction factorielle est la suivante: p> typiquement vous entrez ensuite dans
10 sur 10 pour style simplement pour l'utilisation de "x => x <= 1? 1: x * factorielle (x-1);" ... x => x <= 1 :)
Merci Jon, j'ai essayé de cette façon plus tôt. Mais je pensais que c'est cool faire cela sans récursion. merci pour les liens.
+1 Pour mémoisation ... BTW, il y a une bibliothèque intéressante appelée Elevate qui fournit une méthode d'extension pour mémoiser une fonction: Elevate.CodePlex.com/sourcecontrol/changeset/view/...
Homme ... je me sens comme un idiot. Je devais aller à Wikipedia et regarder la notice. J'ai un diplôme en SCI de Comp, et je n'ai jamais entendu parler de ce mot avant aujourd'hui. Merci de m'avoir appris quelque chose.
Wiki Link pour des personnes comme John et moi-même.
Juste pour continuer sur la réponse de Jon, voici comment vous pouvez mémoter la fonction factorielle afin de ne pas tout recomputer à chaque étape: édition: le code ci-dessus n'est pas correct , parce que avec ce code, factorielle code> appels
factorial code>, pas
factorielmemoizizé code>. Voici une meilleure version: p>
factorial code> est appelé 10 fois, contre 55 fois pour la version précédente p> p>
@THOMAS, U ROCK ... Je n'ai jamais considéré comme la mémoisation .. Merci d'avoir donné une perspicacité ....
Notez qu'il est plus rapide des grandes valeurs, mais probablement plus lentement pour de petites valeurs, en raison de la surcharge de l'insertion et de la recherche de dictionnaire
J'ai essayé de trouver quelque chose qui ressemble à la fonction de numérisation F #, mais a échoué depuis mon Linq n'est pas encore très fort.
Voici ma monstruosité: p>
//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);
@CFERN, merci pour la réponse .. c'est cool .... Vous avez donné des possibilités différentes que j'ai manquées ....
simple mais pas de récursivité ici:
public static int Factorial(this int count) { return count == 0 ? 1 : Enumerable.Range(1, count).Aggregate((i, j) => i*j); } 3.Factorial() == 6