Das finden einer Primzahl im Schema mit natürlichen Rekursion
Ich bin immer noch einstecken Weg bei den übungen, Wie man in den Design-Programme auf meinem eigenen, aber haben es geschafft, wieder stecken. Dieses mal ist es die Frage 11.4.7:
Entwickeln Sie die Funktion
ist-nicht-teilbar-durch<=ich. Es verbraucht
Natürliche Zahl [>=1], ich, und eine Natürliche
Anzahl m, mit i < m,. Falls m nicht
teilbar durch eine Zahl zwischen 1
(exklusive) und ich (inclusive), die
Funktion liefert true, andernfalls, seine
die Ausgabe ist false.Verwenden ist-nicht-teilbar-durch<=i zu definieren
prime?, das verbraucht eine Natürliche
Anzahl und bestimmt, ob oder nicht
es ist eine Primzahl.
Den ersten Teil hatte ich nicht zu hart mit:
;; A natural number [>=1] is either 1. 1 or
;; 2. (add1 n) where n is a natural number [>=1].
;; is-not-divisible-by<=i : N[>=1] N -> boolean
(define (is-not-divisible-by<=i i m)
(cond
[(= i 1) true]
[else (cond
[(= (remainder m i) 0) false]
[else (is-not-divisible-by<=i (sub1 i) m)])]))
(is-not-divisible-by<=i 3 6) ; expected: false.
(is-not-divisible-by<=i 6 7) ; expected: true.
Aber ich kann einfach nicht sehen, wie kann ich eine variable verwenden, um dies zu tun, während mit den natürlichen Rekursion. Ich dachte über die Verwendung einer Liste, aber, das zeigt die gleichen Probleme.
Die einzige Lösung, die ich sehen kann, ist mit dem weiteren Variablen-sagen wir x-der gleiche Wert wie n, und dann, es einfach zu tun die Art und Weise ist-nicht-teilbar-durch<=ich kann es. Aber ich denke, die Autoren wollen für mich, es zu tun einige andere, einfachere Möglichkeit. (Und ich weiß gar nicht, wie das zu tun, was ich beschrieben sowieso, haha.)
Dieses problem hat wirklich Zerschlagung meinen Hintern, so dass jede Hilfe oder Hinweise, wenn Sie könnte, wäre toll!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Primzahl ist eine Zahl, die nicht geteilt werden kann durch jede Zahl kleiner als Sie selbst. Haben Sie bereits umgesetzt ", kann nicht geteilt werden, indem eine beliebige Anzahl kleiner als" Teil:
(prime? 1) bekommt ein "division durch null" - Fehler.
hier ist eine modifizierte version der original-code. Es kümmert sich um (prime? 1) problem für jetzt.
Nun (prime? 1) liefert #t
#f
im Fall von 1, 1 ist nicht prim.Ist es nicht notwendig, dass Sie teilen alle zahlen von n-1 bis 2 zu überprüfen primality. Sie brauchen nur zu überprüfen (floor (sqrt n)). So ist eine schnellere Zufahrt (speziell für große zahlen), die kümmert sich auch über die unbestimmten (prime? 1) problem ist: