2016-04-05 6 views
0

Ich versuche, eine Funktion zu erstellen, die Liste als eine Eingabe nimmt und eine Funktion ausgibt. Ich bin verwirrt mit den Rekursionsaufrufen, die gemacht werden müssen, um durch die Liste zu gehen.Funktion im Schema, die Liste als Eingabe nimmt und eine Funktion ausgibt

(define S (buildfunc '(1 0 -2 -3 4))) 

Eg: eine Funktion erzeugt werden würde, die als Eingabe

  • eine ganze Zahl und

      nimmt fügt 1 bis es
    • Quadrate das Ergebnis
    • das Quadrat von 2 multipliziert,
    • multipliziert das letzte Ergebnis mit 3,
    • und fügt 4
    • hinzu

    If (S 4), ist die Ausgabefunktion das Ergebnis wäre:

    4 + 1 = 5 -> 25 -> 25 * 2 = 50 -> 50 * 3 = 150 -> 150 + 4 ==> 154

    Der Code, die ich bin derzeit mit ist:

    (define (s n) (lambda (L) (buildfunc n L))) 
    
    (define (buildfunc n L) 
        (cond 
        ((null? L) '()) 
        ((equal? (car L) 0) (* n n)) 
        ((positive? (car L)) (+ n (car L))) 
        ((negative? (car L)) (* n (car L))) 
        (else 
        (buildfunc n (cdr L))))) 
    
    
    (define C (s 3)) 
    
    (C '(1 0 -2 -3 4)) 
    
  • Antwort

    1

    Hmm. Hier ist, wie ich über die Lösung dieser gehen würde:

    (define (buildfunc cmds) 
        (define (process cmd value) 
        (cond ((zero? cmd) (* value value)) 
          ((positive? cmd) (+ value cmd)) 
          ((negative? cmd) (* value (- cmd))))) 
        (lambda (n) 
        (foldl process n cmds))) 
    

    Beispiel Nutzung:

    > ((buildfunc '(1 0 -2 -3 4)) 4) 
    154 
    

    Update: Sie können sicherlich die foldl in einen manuellen Schleife entrollen, etwa so:

    (define (buildfunc cmds) 
        (define (process cmd value) 
        (cond ((zero? cmd) (* value value)) 
          ((positive? cmd) (+ value cmd)) 
          ((negative? cmd) (* value (- cmd))))) 
        (lambda (n) 
        (let loop ((value n) 
           (cmds cmds)) 
         (if (null? cmds) 
          value 
          (loop (process (car cmds) value) (cdr cmds)))))) 
    
    +0

    Gibt es eine Möglichkeit, die Funktion ohne 'foldl' zu schreiben? Ich bin neu im Schema und versuche zu verstehen, wie ich die Liste durchquere. – Siva

    Verwandte Themen