Sie haben Recht über den maximum
Teil. Um die Liste (das ist, was Haskells [] s sind, Arrays unterschiedliche Strukturen sind) können Sie die map
Funktion höherer Ordnung verwenden müssen, wie folgt aus:
chainLength n = length (chain n)
lengths = map chainLength [1..1000000]
Im Wesentlichen map
nimmt als Argumente eine Funktion und eine Liste. Sie wendet die Funktion auf jedes Element in der Liste an und gibt die Liste der Ergebnisse zurück.
Da Sie die Zahl, deren Kette hat, dass die Länge benötigen werden, können Sie die chainLength
Funktion ändern möchten, die Anzahl als auch zurück, wie folgt aus:
chainLength n = (n, length (chain n))
diese Weise werden Sie eine Reihe von Paaren haben mit jeder Nummer und ihrer Kettenlänge.
Jetzt müssen Sie das Paar mit der größten zweiten Komponente erhalten. Das ist, wo die maximumBy
Funktion hereinkommt. Es funktioniert genau wie maximum
, aber nimmt eine Funktion als ein Parameter, um zu wählen, wie man die Werte vergleicht. In diesem Fall ist die zweite Komponente des Paares. Diese Vergleichsfunktion nimmt zwei Zahlen und gibt einen Wert vom Typ Ordering
zurück. Dieser Typ hat nur drei mögliche Werte: LT
, EQ
, GT
, für weniger als, gleich und größer als jeweils.
Wir brauchen also eine Funktion, die zwei Paare gegeben sagt uns, wie die zweiten Komponenten miteinander vergleichen:
compareSnd (_, y1) (_, y2) = compare y1 y2
-- Or, if you import Data.Function, you can write it like this (thanks alexey_r):
compareSnd = compare `on` snd -- reads nicely
ich die Standard-compare
Funktion verwendet, die Zahlen vergleicht (na ja, not just numbers).
Jetzt brauchen wir nur die maximal mit dieser Funktion zu erhalten:
longestChain = maximumBy compareSnd lengths
dass Sie ein Paar der Zahl mit der längsten Kette und der entsprechenden Länge bekommt. Fühlen Sie sich frei, und snd
wie Sie bitte anwenden.
Beachten Sie, dass dies mit Hilfe von zip
und Komposition viel präziser sein könnte, aber da Sie die Frage als Neuling markiert haben, dachte ich, es wäre besser, es so zu zerlegen.
Projekt Euler eh sein? (Problem 14) – yairchu
Vielleicht möchten Sie einige dynamische Programmierung dafür verwenden - lassen Sie die Kette für 10 die bereits berechnete Kette für 3 wiederverwenden. Dazu müssen Sie Ihre Ergebnisse in einer Zwischendatenstruktur wie einer Karte oder speichern ein Array - aber es wird weniger Verarbeitung benötigen. – rampion