2017-03-18 5 views
0

Schreiben Sie eine Scheme-Funktion, die eine einfache Liste von Zahlen als Parameter verwendet und die zweitgrößte und zweitkleinste Zahl in der Liste zurückgibt. Die zurückgegebenen Werte sollten in einer Liste als (kleinste größte) Beachten Sie, dass, wenn benötigt, können Sie andere Hilfsfunktionen definieren, die die Minmax-Funktion in seinem Körper aufrufen kann.Suchen Sie die zweitgrößte und kleinste Nummer in einer Liste

(DEFINE (minmax Liste)

(

Körper

) )

(define (mintwo lst) 
    (cond ((null? (cdr lst)) (car lst)) 
      ((< (car lst) (mintwo (cdr lst))) (car lst)) 
      (else (mintwo (cdr lst))))) 

(define (maxtwo lst) 
    (cond ((null? (cdr lst)) (car lst)) 
      ((> (car lst) (maxtwo (cdr lst))) (cdr lst)) 
      (else (maxtwo (cdr lst))))) 

diese Funktionen I für max haben und min aber der lustige Teil ist, dass, wenn ich Eingabe

(maxtwo '(3 4 2 9 3 8))

ich die Fehlermeldung erhalten, die

korrekt ist

ein echter als zweites Argument erwartet, gegeben (Liste 3 8)

der Fehler ist die dritte Zeile in der maxtwo Funktion

Nun, wie kann ich mache eine Funktion, um diese 2 mintwo und maxtwo Funktion zu nennen und als eine Ausgabe ist die zweitkleinste und zweitgrößte Zahl in einer Liste

Antwort

0

Kann ich nicht sagen, dass ich sicher Ihre Problemaussage verstehe, aber die maxtwo Funktion, die Sie verwenden findet das zweitgrößte Element einer Liste nicht; es findet das Größte. Dasselbe gilt für mintwo.

Ein Algorithmus der zweit größte Element eines Array in C für die Suche:

int snd_maximum(int arr [], int size) { 
    int max = * arr++; 
    int snd = * arr++; 
    size -= 2; 

    int n; 

    if (snd > max) { 
     n = max; 
     max = snd; 
     snd = n; 
    } 

    while (size --) { 
     n = * arr++; 

     if (n > max) { 
     snd = max; 
     max = n; 
     } 
     else if (n > snd) { 
     snd = n; 
     } 
    } 

    return snd; 
} 

Die Sammlung ≥ 2 Elemente haben müssen. Eine grobe Übersetzung:

(define (snd-max xs) 
    (define (trav max snd xs) 
     (if (null? xs) 
     snd 
     (let ((x (car xs))) 
      (if (> x max) 
       (trav x max (cdr xs)) 
       (if (> x snd) 
        (trav max x (cdr xs)) 
        (trav max snd (cdr xs))))))) 
    (let ((x (car xs)) 
     (x' (cadr xs))) 
     (if (> x x') 
     (trav x x' (cddr xs)) 
     (trav x' x (cddr xs))))) 

Die Suche nach zweitgrößten und Least in einem einzigen Durchlauf der Sammlung kombiniert werden, ein Tupel der beiden Ergebnisse zurück.

Um das n-größte Element einer Sammlung zu finden, muss diese Sammlung im Allgemeinen von doppelten Elementen befreit und sortiert werden. Dann liefert eine ordinale (naturals from 1) Suche. Um das n-te größte Element zu finden, muss die Sammlung ≥ n eindeutige Elemente haben.

Verwandte Themen