Mal wieder SCHEME...



  • Hallo,

    ich muss unter Anderem ein kleines Programm schreiben, das mir ausgibt ob es sich um eine primzahl handelt oder nicht.

    Zunächst das was ich habe:

    (define x 1)
    
    (define (prim? n)
             "x wird um 1 erhöht"
             (if (= x n)
            (display "#t")
    
    (if (= (modulo n x) 0)
          (display "#f")
        (prim? n))))
    

    Eine Primzahl (größer 1!) ist ja erst eine, wenn sie nur durch sich selbst teilbar ist und durch 1.

    Ich habe mir dann einfach gedacht, dass ich x mit 1 definiere. x ist die Zahl mit der ich die eingegebene Zahl n teile.
    Wenn n=x ist, dann ist es ja eine Primzahl, also im Fall von 2.
    Die Zahl darf ja nicht durch andere Zahlen teilbar sein.
    Und wenn x ungleich n ist, dann prüft er ob n durch x ohne Rest teilbar ist. Wenn der Rest 0 ist, dann ist es keine Primzahl, weil die Zahl n durch eine andere teilbar ist. Und wenn sie nicht teilbar ist, dann wird (prim? n) wieder aufgerufen und x um 1 erhöht.....
    Und wenn x = n erreicht ist, dann muss es eine Primzahl sein, weil davor die "Abbruchbedingung" nicht erreicht wurde, also dass n durch eine andere Zahl außer 1 und sich selbst teilbar ist.

    Aber wie mache ich das, dass x um 1 erhöht wird?? Mit (x (x + 1)) funktioniert es nicht...



  • Ich habe das jetzt so hinbekommen.

    (define (prim? n)
      (cond ((= n 2) #t)
            ((= (modulo n 2)0) #f)
       (else
        (let trynumber((teiler 3))
             (cond((>= teiler n) #t)               
                  ((= (modulo n teiler)0) #f)
             (else (trynumber (+ teiler 2))))))))
    

    Jetzt habe ich eine Zusatzaufgabe:

    Schreiben Sie eine Funktion (suche-Primzahl obere-Grenze untere-Grenze), die alle Primzahlen innerhalb des Intervalls [obere-Grenze, untere-Grenze] ausgibt.

    Dazu habe ich folgendes:

    (define (suche-Primzahl obere-Grenze untere-Grenze)
      (if (prim? untere-Grenze)(begin(display untere-Grenze) (display " ")))
      (cond ((>= untere-Grenze obere-Grenze))
      (else (if (= (modulo untere-grenze 2)0) (suche-Primzahl obere-Grenze (+ untere-Grenze 1)) (suche-Primzahl obere-Grenze (+ untere-Grenze 2))))))
    

    Aber irgendwie geht das nicht...er gibt z.b. nur "#t" aus...und nicht die Zahlen...

    Beispiel: (suche-Primzahl 2 😎 --> 2, 3, 5, 7

    Wäre für Hilfe sehr sehr dankbar!!!


Anmelden zum Antworten