2010-11-15 49 views
1

我是計劃新手,試圖理解我的功課。 我有個功能我提出早期稱爲重複,它看起來像這樣:計劃問題(使用函數作爲參數)

(DEFINE (duplicate lis) 
      (IF (NULL? lis) '()) 
      ((CONS (CAR lis) (CONS (CAR lis) (duplicate (CDR lis)))) 
     )) 

典型的I/O從這將是I:(重複「(1 2 3 4))○: (1 1 2 2 3 3 4 4),所以基本上它複製列表中的所有內容。 繼續: 現在我應該做一個叫做comp的功能。 它應該這樣就可以了:

(DEFINE (comp f g) (lambda (x) (f (g (x)))) 

在那裏我可以輸入「(1 2 3 4),它會返回(1 1 4 4 9 9 16 16)

因此f = 重複和g = lambda。 我知道拉姆達大概應該是這樣的:

(lambda (x) (* x x)) 

但這裏有一個問題開始的地方,我已經花了這幾個小時,你可以看到沒有取得很大進展。

任何幫助,將不勝感激。 此致敬禮。

+1

1.在comp()中你不能有'(x)'; 'x'不是一個函數:它應該是'(gx)'而不是'(g(x))'2.要使用帶'lambda'的'comp',你的(lambda(x ..))需要工作在列表中與'double'兼容;實際上,這個'lambda'只能用於一個數字。沒有循環就很難做到。 – frayser 2010-11-15 14:04:08

回答

2

使用map

> (map (lambda (x) (* x x)) (duplicate '(1 2 3 4))) 
=> (1 1 4 4 9 9 16 16) 

,或者修改duplicate採取程序作爲其第二個參數,並將其應用到列表中的每個元素:

(define (duplicate lst p) 
    (if (null? lst)() 
     (append (list (p (car lst)) (p (car lst))) (duplicate (cdr lst) p)))) 

> (duplicate '(1 2 3 4) (lambda (x) (* x x))) 
=> (1 1 4 4 9 9 16 16) 
+0

感謝您的幫助,我感謝它:) – CyberBuffalo 2010-11-15 18:59:06

0

一種方法做的是如下:

(define (comp f g) (lambda (x) (f (g x)))) 
(define (square x) (* x x)) 
(define (dup x) (list x x)) 
(define (duplicate-square lst) 
    (foldr append '() (map (comp dup square) lst))) 

現在在repl處,執行:

> (duplicate-square '(1 2 3 4)) 
'(1 1 4 4 9 9 16 16) 
+0

感謝您的幫助,我欣賞它:) – CyberBuffalo 2010-11-15 18:59:27