2016-04-06 8 views
0

Ich möchte ein Programm machen, das herausfindet, ob eine Zahl prim ist oder nicht.Schläger mit Lambda anstelle von 2 Funktionen

Zuerst habe ich diese Funktion, die funktioniert, aber muss den Benutzer 2 als zweites Argument einzufügen:

(define (prim? number counter) 
    (if (>= counter number) 
     #t 
     (if (= (modulo number counter) 0) 
      #f 
      (prim? number (+ counter 1))))) 

So wollte ich das den Benutzer in der Lage sein, die Funktion zu nutzen, indem nur die notwendigen Informationen mit, die Nummer, die er testen möchte. Das war die Lösung:

(define (is-prime? number) 
    (prim? number 2)) 

(define (prim? number counter) 
    (if (>= counter number) 
     #t 
     (if (= (modulo number counter) 0) 
      #f 
      (prim? number (+ counter 1))))) 

Meine Frage war dann, wie kann ich den Code unter Verwendung von Lambda-Ausdrücke umschreiben und nur eine elegante Funktion? Also schrieb ich folgendes:

(define (prim number) 
    (lambda(counter) (set! counter 2) 
    (if (>= counter number) 
     #t 
     (if (= (modulo number counter) 0) 
      #f 
      ((lambda(x) (set! counter (+ counter 1))) 
       (prim number)))))) 

Als ich (prim 5) in der REPL laufen es gibt mir die Meldung #<procedure:D:/Racket/prim.rkt:5:2> und nicht, wenn die Zahl eine Primzahl ist oder nicht.

Wie könnte ich die Funktion mit Lambdas schreiben?

+0

Ich denke, dass Sie nicht "Lambda" verwenden möchten, was Sie wollen, ist eine innere Hilfsprozedur mit zusätzlichen Parametern zu definieren, verwenden Sie ein benanntes "Let" dafür. –

Antwort

4

Ich denke, mit einem Namen let und cond wäre eleganter, und Sie sollten vermeiden, set! um jeden Preis zu verwenden. Versuchen Sie folgendes:

(define (is-prime? number) 
    (let prim? ((number number) (counter 2)) 
    (cond ((>= counter number) #t) 
      ((= (modulo number counter) 0) #f) 
      (else (prim? number (+ counter 1)))))) 

Die oben definiert eine innere Hilfsfunktion prim? genannt. Das ist einfacher als die Definition eines "lambda", wie Sie es vorgeschlagen haben.

+0

Ich habe gerade eine neue Sache gelernt! Vielen Dank! –

Verwandte Themen