Haskell-Funktion, um zu testen, ob Int perfektes Quadrat ist, indem eine unendliche Liste verwendet wird

7

Aus reiner Freude und Übung versuche ich eine einfache Haskell-Funktion zu schreiben, um zu bestimmen, ob eine ganze Zahl ein perfektes Quadrat ist. Jetzt weiß ich, dass es andere Lösungen gibt, aber ich frage mich, ob es einen Weg gibt, es mit einer unendlichen Liste zu machen. Ich habe damit begonnen, aber aus klaren Gründen funktioniert es nicht (es hört nie auf!)

%Vor%

Auch, wenn ich hinzufügen könnte, kann jemand darauf hinweisen, wie man eine unendliche Liste nach der ersten Instanz von etwas sucht und dann STOPP! ?

    
CodyBugstein 26.04.2013, 04:02
quelle

5 Antworten

11

Über die unendliche Suchfunktion:

Es gibt bereits eine Funktion, die eine Liste nach einem Wert durchsucht - elem .

Wenn Sie annehmen, dass die unendliche Liste sortiert ist, könnten wir eine Version von elem schreiben, die auf einer solchen Liste funktioniert. Dies kann leicht erreicht werden, indem zuerst alle Elemente zurückgewiesen werden, die kleiner als der Suchwert sind. Der erste nicht zurückgewiesene Wert muss dann gleich oder größer als das Suchelement sein. Wenn equal - return true, gebe sonst false zurück

%Vor%

Beispielverwendung:

%Vor%

Es gibt jedoch ein Problem mit infiniteElem1 : Wenn es auf einer endlichen Liste verwendet wird, kann es eine Ausnahme auslösen, wenn das Element nicht gefunden wird:

%Vor%

Dies ist ein Grund, warum die Funktion head am besten vermieden wird. Eine bessere Lösung ist dies:

%Vor%

Jetzt funktioniert es auch mit einer endlichen sortierten Liste:

%Vor%

Damit wird Ihr Problem trivial:

%Vor%     
David Miani 26.04.2013, 04:57
quelle
6

Sie können takeWhile oder dropWhile verwenden. Zum Beispiel:

%Vor%     
hammar 26.04.2013 04:11
quelle
5

Leider funktioniert die Verwendung von Sum auf einer unendlichen Liste nicht. Insbesondere, wie können Sie jemals wissen, dass jedes zukünftige Element der Liste Null sein wird? Sie können nicht, also müssen Sie die gesamte Liste vor der Berechnung der Summe erhalten. Für eine unendliche Liste kann dies etwas dauern.

Wenn Sie wirklich eine unendliche Liste verwenden wollen - unendliche Listen sind Spaß -, schlage ich vor, eine unendliche Liste von Quadratzahlen zu konstruieren. Dann überprüfe ob n in dieser Liste ist. Sie müssen ein wenig clever sein, wie Sie dies tun, um sicherzustellen, dass es endet, aber ich überlasse das dem Leser als Übung. (Mann, ich liebe diesen Ausdruck: P.)

Sie können etwas aus einer unendlichen Liste mit einer Funktion wie, berechenbar, find finden. Dies wird tatsächlich aufhören, sobald es etwas findet. Wenn das Element jedoch nicht findet, wird es nie aufhören. Dies ist möglicherweise nicht das gewünschte Verhalten. Es gibt keine allgemeine Möglichkeit, dies zu umgehen, aber Sie können herausfinden, wie Sie es für ein bestimmtes Problem beheben können: Wenn die Liste beispielsweise in aufsteigender Reihenfolge sortiert ist, können Sie takeWhile (< limit) verwenden, wobei limit die Obergrenze ist die mögliche Antwort.

    
Tikhon Jelvis 26.04.2013 04:11
quelle
4
%Vor%     
Piotr Lopusiewicz 26.04.2013 04:13
quelle
4

Nur zum Spaß, hier ist eine andere unendliche Listenversion:

%Vor%     
גלעד ברקן 26.04.2013 15:27
quelle

Tags und Links