Ich habe eine Liste von Zeichen und Ganzzahl wie [('1',1),('2',2),('3',3),('4',4),('5',5)]
und möchte die Ganzzahlen in den Prozentsatz jeder Zahl für die Gesamtzahl wie [('1',7),('2',13),('3',20),('4',27),('5',33)]
drehen. Ich habe eine rekursive Funktion versucht, die einen Parameter wie (c,i):rest
nimmt und dann die i
durch den Gesamtbetrag teilt und dann die Funktion mit rest
aufruft. Aber nach jeder einzelnen Schleife hat sich die Gesamtsumme geändert. Also gibt es irgendeine Weise, die ich die Summe von Anfang an deklariere und es wie andere Sprachen immer wieder benutze.Haskell - unmodifizierte Variable in einer rekursiven Funktion
1
A
Antwort
2
Sie müssen die gesamten im Voraus berechnen - Sie so etwas wie
f :: Integral b => [(a,b)] -> [(a,b)]
f lst = let total = sum $ map snd list
in map (\(x,y) -> (x,(100 * y)`div` total)) lst
verwenden können Hinweis: es wäre eine gute Idee, die Integral
-Werten jedes Zeichen vorher zugeordnet zu sammeln, macht dies die Ausgabe einer etwas klarer (meiner Meinung nach), aber das wäre eine Übung für den scharfsinnigen Leser.
Um diese Funktion deutlicher zu machen - ich würde auch empfehlen, newtypes
für Value
und Percentage
einzuführen, so dass Sie nie versuchen, Werte mit Prozentsätzen hinzuzufügen.
newtype Value a = V {extractV :: a}
newtype Percentage = P {percent :: Integer}
f :: Integral b => [(a,Value b)] -> [(a,Percentage)]
Verwandte Themen
- 1. Haskell AST mit rekursiven Typen
- 2. Proxys einer rekursiven Funktion
- 3. Ergeben von einer rekursiven Funktion
- 4. Verwendung in einer rekursiven Funktion in C#
- 5. Lösung mit einer rekursiven Funktion
- 6. Python-Liste entrollen in einer rekursiven Funktion
- 7. Rückgabewert in einer rekursiven Funktion JAVA
- 8. Tracing einer rekursiven faktoriellen Funktion in C++?
- 9. Beenden einer rekursiven Funktion in Elixir
- 10. fork/pipe/close in einer rekursiven Funktion
- 11. Erstellen von polymorphen rekursiven Typen in Haskell
- 12. XSLT - Variable Zuweisung von einer rekursiven Vorlage
- 13. Musterabgleich in einer Haskell-Funktion
- 14. Wie man Wiederholungen einer rekursiven Funktion zählt?
- 15. Standardlistenwert in der rekursiven Funktion
- 16. Instantiiertyp Variable in Haskell
- 17. Zeitkomplexität einer rekursiven Funktion mit for-Schleife
- 18. OpenMP Parallelisierung auf einer rekursiven Funktion
- 19. Symfony-Fehler beim Implementieren einer rekursiven Funktion
- 20. Hilfe beim Erstellen einer rekursiven Funktion C#
- 21. Beenden Sie vollständig von einer rekursiven Funktion
- 22. Starre Variable in Haskell
- 23. Definieren von Variablen innerhalb einer Funktion Haskell
- 24. Memoisierung eines einzelnen Parameters in einer Multiparameter-Funktion in Haskell
- 25. Wie wird in einer rekursiven Funktion gezählt? [python]
- 26. Handhabung Erstellen einer Zeichenfolge mit einer rekursiven Funktion
- 27. Haskell typeclasses in einer Funktion überprüfen
- 28. dequeue Funktion aus einer Liste in Haskell
- 29. Implementieren einer rekursiven Funktion, die eine andere Funktion rekursiv ausführt
- 30. Haskell protobuf: mehrdeutige Variable
Minor nitpick: Sie müssen nicht unbedingt brauchen die Gesamt * im Voraus zu berechnen * - die Liste Ergebnis und die Summe in einem einzigen Durchlauf der Eingabeliste berechnen kann, alles dank der Magie der Faulheit. – user2407038
@ user2407038 Das verstehe ich nicht ganz - wie kann man die Summe verwenden, ohne dass sie vorher berechnet wurde und dies in einer einzigen Traversierung ausführen. meinen Sie, dass die Berechnung des Prozentsatzes aufgeschoben wird, bis die Liste vollständig ausgewertet ist? – epsilonhalbe