2016-07-21 16 views

Antwort

2

Hier ist eine Lösung, in der (fib i) nur einmal ausgewertet wird.

(define (fibs-upto x) 
    (for*/list ([i  (in-naturals)] 
       [fib-i (in-value (fib i))] 
       #:break (> fib-i x)) 
    fib-i)) 

Aber es könnte einfacher sein, eine Standard-Schleife zu lesen:

(define (fibs-upto x) 
    (define (loop i) 
    (define fib-i (fib i)) 
    (if (> fib-i x) 
     '() 
     (cons fib-i (loop (+ i 1))))) 
    (loop 0)) 

Das heißt, ist es wichtig, dass fib Cache zuvor berechneten Werte für die oben genannten Lösungen O(n) zu sein.

UPDATE

Eine Version sequence-map mit:

(define (fibs-upto x) 
    (for/list ([y (sequence-map fib (in-naturals))] 
      #:break (> y x)) 
    y)) 
+0

Ich mag diese Art von Standardschleife. –

+0

@bitrauser FWIW Ich habe eine Version mit 'sequence-map' hinzugefügt – soegaard

0

sein, dass Sie dies in Schläger geschrieben ... Dies ist eine Lösung für das Problem sein kann, aber ich habe einen Teil davon ändern, welche ist einfache Arbeit, wenn es ein Problem ist. Ich hoffe, das hilft

// i = Nummer beginnt bei x = Nummer gehen bis zu

(define (fibs-upto i x) 
    (cond 
    [(> (fib i) x) empty] 
    [else (cons (fib i)(fibs-upto (+ i 1) x))])) 

Umgehung

(define (fibs-upto x) 
    (fibs-help 0 x)) 

(define (fibs-help i x) 
    (cond 
    [(> (fib i) x) empty] 
    [else (cons (fib i)(fibs-help (+ i 1) x))])) 
+0

Verwenden Sie eine seltsame Implementierung von' fib', die eine Prozedur zurückgibt? Wenn es nicht wie eine Prozedur aufgerufen wird, würde '(ans) 'das Programm anhalten ... – Sylwester

+0

@Sylwester Ich habe das in letzter Minute hinzugefügt, habe es nicht wirklich überprüft, ob es funktioniert, ich bin es gewohnt, nicht definieren oder lassen zu dürfen/set .. – Javant

+0

Deine neuen 'fibs-upto'- und' fibs-help'-Funktionen berechnen ''fib i)'' neu. Sie sollten die lokalen Definitionen '(ans ans (fib i))' zurücksetzen. Sie mussten nur "ans" anstelle von "(ans)" schreiben. (Denken Sie daran, dass Klammern die Funktion im Racket bedeuten) –

1

, wenn Sie nur eine Liste der Fibonacci-Zahlen mögen, können Sie kann z

(define (fib-upto limit) 
    (let loop ([fibs '(1 1)]) 
    (let ((fn (+ (first fibs) (second fibs)))) 
     (if (> fn limit) 
      (reverse fibs) 
      (loop (cons fn fibs)))))) 
;; e.g.: 
(fib-upto 100) 
'(1 1 2 3 5 8 13 21 34 55 89) 

Wenn Sie einige idiomatische Weg zu bauen Listen mit Stop-Zustand wissen wollen, werfen Sie einen Blick auf ausklappen (oder entfalten rechts wenn Sie eher entfalten wollen) - http://srfi.schemers.org/srfi-1/srfi-1.html#FoldUnfoldMap