2016-04-05 10 views
0

Bir giriş olarak liste alan ve bir işlev çağıran bir işlev oluşturmaya çalışıyorum. Listeden geçmek için yapılması gereken özyineleme çağrıları ile karıştırıldım.Bir giriş olarak listeyi alan ve bir işlev çağıran şemadaki işlev

(define S (buildfunc '(1 0 -2 -3 4))) 

Örnek: girdi olarak bir tamsayı ve

  • alan bir fonksiyon üretilecek olan buna
  • kareler
  • 2 ile kare çarpar sonuç, 1 ekler
  • Bu sonucu 3,
  • ile çarpar ve 4
  • ekler (S 4) çıkış fonksiyonu

ise, sonuç olacaktır:

4 + 1 = 5 -> 25 -> 25 x 2 = 50 -> 50 * 3 = 150 - anda kullanarak> + 150 4 ==> 154

kodudur:

(define (s n) (lambda (L) (buildfunc n L))) 

(define (buildfunc n L) 
    (cond 
    ((null? L) '()) 
    ((equal? (car L) 0) (* n n)) 
    ((positive? (car L)) (+ n (car L))) 
    ((negative? (car L)) (* n (car L))) 
    (else 
    (buildfunc n (cdr L))))) 


(define C (s 3)) 

(C '(1 0 -2 -3 4)) 

cevap

1

hı.

(define (buildfunc cmds) 
    (define (process cmd value) 
    (cond ((zero? cmd) (* value value)) 
      ((positive? cmd) (+ value cmd)) 
      ((negative? cmd) (* value (- cmd))))) 
    (lambda (n) 
    (foldl process n cmds))) 

Örnek kullanım:

> ((buildfunc '(1 0 -2 -3 4)) 4) 
154 

Güncelleme: kesinlikle şöyle manuel döngüye foldl göz önüne sermek için:

(define (buildfunc cmds) 
    (define (process cmd value) 
    (cond ((zero? cmd) (* value value)) 
      ((positive? cmd) (+ value cmd)) 
      ((negative? cmd) (* value (- cmd))))) 
    (lambda (n) 
    (let loop ((value n) 
       (cmds cmds)) 
     (if (null? cmds) 
      value 
      (loop (process (car cmds) value) (cdr cmds)))))) 
İşte bu çözümü hakkında gitmek istiyorum nasıl
+0

'foldl' kullanmadan işlevi yazmanın bir yolu var mı? Şema için yeniyim ve listeden geçebileceğim yolu anlamaya çalışıyorum. – Siva