scheme

iceman1888

Neuling
Thread Starter
Mitglied seit
06.09.2009
Beiträge
66
Ort
Kiel
hi,
ich soll ein programm schreiben welches zu berechnung von potenzen verwendet werden kann und es soll iterativ sein..
ich hab es wie folgt aber er gibt mir immer nur 1 aus was is der fehler??

(define (schnell-pot-iter b n)
(pot-iter b n))
(define (pot-iter b n)
(cond ((= 0 n) 1)
((gerade? n) (pot-iter (quadrat b) (/ n 2)))
(else (pot-iter b (- n 1)))))
(define (gerade? n) (=(remainder n 2) 0))
(define (quadrat b)(* b b))

greetz iceman:hail:

---------- Beitrag hinzugefügt um 17:23 ---------- Vorheriger Beitrag war um 15:26 ----------

hat keine ne idee wie es funktionieren könnte??
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Das liegt an:
Code:
(cond ((= 0 n) 1)
Sobald n = 0 wird immer 1 zurueckgeben.
 
ja aber wie muss es denn aussehen??
ich muss ja irgendwie sagen das 1 rauskommen soll wenn der exp 0 ist
 
Das solltest du in der anderen Funktion machen, bevor du pot-iter aufrufst.
 
Heute etwa noch nicht dein SICP gelesen?

Code:
(define pot
  (lambda (base exp)
    (define iter
      (lambda (base mult i)
        (if (= i 1)
            mult
            (* mult (iter base mult (- i 1))))))
    (if (= exp 0)
        1
        (iter base base exp))))
 
meinst du so:
(define (schnell-pot-iter b n)
(cond ((= n 0)1)
((= b 0)0)
(pot-iter b n)))
(define (pot-iter b n)
(cond ((gerade? n) (pot-iter (quadrat b) (/ n 2)))
(else (pot-iter b (- n 1)))))
(define (gerade? n) (=(remainder n 2) 0))
(define (quadrat b)(* b b))

??

---------- Beitrag hinzugefügt um 20:52 ---------- Vorheriger Beitrag war um 20:49 ----------

@asdfman
was ist denn "SICP"??
aber wenn ich das eingebe meckert er auch rum...
ich darf leider noch kein lambda und multi benutzen...
 
multiplizieren schon aber nich mit mult sondern mit *....
in dem buch steht aber keine iterative variante des potenzierens..
oder??
 
@Iceman: Ich meine so:
Code:
(define (schnell-pot-iter b n)
  (if (= n 0)
      1
      (pot-iter b n)))
...

@asdfman: Das ist zu langsam. Sinn ist es auf eine logarithmische Laufzeit zu kommen indem man das in einzelne Teile unterteilt: 2^8 = 2^4 * 2^4 = 2^2 * 2^2 * 2^2 * 2^2 = ...
Einfach durchiterieren braucht zu viele Schritte und damit eine lineare Laufzeit.
 
mult ist doch nur eine Variable. Die kannst du nennen wie du willst.
Und statt
Code:
(define a (lambda (b) (...))
kannst du auch
Code:
(define (a b) (...))
nehmen.
 
so ich hab das jetzt so:
(define (schnell-pot-iter b n)
(if (= n 0)
1
(pot-iter b n)))
(define (pot-iter b n)
(cond ((gerade? n) (pot-iter (quadrat b) (/ n 2)))
(else (pot-iter b (- n 1)))))
(define (gerade? n) (=(remainder n 2) 0))
(define (quadrat b)(* b b))

warum gibt er mir denn da nichts aus??
 
Weil du keine Abbruchbedingung hast.
Da sollte noch ein ((= n 0) b) rein. Und dann ist es immer noch nicht iterativ.
Dazu brauchst du mindestens 3 Variablen. (Basis, Expontent, Zaehler).
 
ich hab das jetzt so und da funzt es aber nur mit geradem exp...
wieso??

(define (schnell-pot-iter b n)
(if (= n 0)
1
(pot-iter b n)))
(define (pot-iter b n)
(cond ((= n 0)b)
((gerade? n) (pot-iter (quadrat b) (/ n 2)))
(else (pot-iter b (- n 1)))))

(define (gerade? n) (=(remainder n 2) 0))

(define (quadrat b)(* b b))

---------- Beitrag hinzugefügt um 21:18 ---------- Vorheriger Beitrag war um 21:17 ----------

wie bau ich den den zähler da ein??
 
So wie ich es gezeigt habe. Bei mir heißt der Zähler i.
 
verdammt ich kriegs echt nicht hin...
aber danke für eure hilfe...
ich muss das aber leider bis morgen früh abgeben und schaff es nicht noch das buch zu lesen...

wär also super wenn mir jemanden eine iterative variante zeigen könnte...

greetz iceman
 
rekursiv, aber effektiv in scheme:
Code:
(define (power x y) ;; x to the power of y
    (cond ((> 0 y) unspecified) ;; negative exponent unspecified
          ((= 0 y) 1) ;; x to the power of 0 is 1
	  ((= 1 y) x) ;; x to the power of 1 is x
	  ((= 0 x) 0) ;; 0 to the power of y is 0
	  ((= 1 x) 1) ;; 1 to the power of y is 1
	  ((= 0 (modulo y 2)) (power (* x x) (/ y 2)))
	  (else (* (power (* x x) (/ (- y 1) 2)) x))
    )
)

um dir nicht alles vorweg zu nehmen, eine andere variante iterativ in haskell:
Code:
-- x to the power of y, undefined for y <= 0
power x y = foldr (*) 1 $ take y $ repeat x
 
Zuletzt bearbeitet:
Arg. Man wies mich darauf hin dass meine Variante auch nicht iterativ war...

Code:
(define pot
  (lambda (base exp)
    (define iter
      (lambda (base acc i)
        (if (= i 1)
            acc
            (iter base (* base acc) (- i 1)))))
  (if (= exp 0)
        1
        (iter base base exp))))
Nun ist sie es.
 
hat niemand eine einfache iterative variante für scheme??
biddde..
 
Was ist denn jetzt an meiner Lösung kompliziert?
Einfacher wirst du es wohl kaum bekommen.
 
wenn ich das in scheme eingebe meckert er immer rum
"lambda: expected only one expression for the function body, but found one extra part in: (if (= exp 0) 1 (iter base base exp))"
und lambda dürfen nicht verwenden
 
Naja wenn du nichtmal copy/paste kannst kann ich dir wirklich nicht mehr helfen ;(
 
Code:
(define pot
  (lambda (base exp)
    (define iter
      (lambda (base acc i)
        (if (= i 1)
            acc
            (iter base (* base acc) (- i 1)))))
  (if (= exp 0)
        1
        (iter base base exp))))


---------- Beitrag hinzugefügt um 22:25 ---------- Vorheriger Beitrag war um 22:24 ----------

genauso hab ich das in scheme eingefügt und dann kommt die fehlermeldung
 
Du bist ein Ersemester und arbeitest mit Dr. Scheme mit einem Beginner Languagelevel.
D.h. Du darfst du eingeschraenkt Funktionen nutzen. lamba gehoerst definitiv nicht dazu.

Außerdem ist das ja auch ueberhaupt nicht komisch, wenn du sowas nach 3 Wochen Studium abgibst und eigentlich noch nie was von gehoert hast.
 
jap stimmt genau...

aber nochmal danke für eure hilfe...

greetz iceman
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh