2016-02-11 66 views
1

我有了這個代碼計劃可變參數函數添加數字

(define mysum 
    (lambda (l) 
     (if (null? l) 
      0 
      (+ (car l) (mysum (cdr l)))))) 

它的工作原理:

(mysum '(1 2 3)) 

得到6,但這

(define (my+func . numbers) 
    (lambda (num) 
    (if (null? num) 
     0 
     (+ (car num) (my+func (cdr num))))) numbers) 

不工作。毫無疑問,我正試圖在lambda內進行遞歸。任何想法我可以做什麼?

回答

3

所以有兩種方法來製作程序。你有這樣的:

(define name (lambda (arg ...) body ...)) 

而且有平等的語法糖:

(define (name arg ...) body ...)) 

如果你願意,你可以做相反的過程與最後一道工序:

(define my+func 
    (lambda numbers 
    (lambda (num) 
     (if (null? num) 
      0 
      (+ (car num) (my+func (cdr num))))) 
    numbers)) 

當您執行(my+func 1 2 3)時,它會創建一個採用一個參數的過程。由於該過程不是最後一個表達式,因此它被丟棄並丟棄,最後一個表達式爲numbers。因此,您將得到(1 2 3)

這會工作:

(define my+func 
    (lambda numbers 
    (if (null? numbers) 
     0 
     (+ (car numbers) (apply my+func (cdr numbers)))))) 

可以翻譯回加糖define

(define (my+func . numbers) 
    (if (null? numbers) 
     0 
     (+ (car numbers) (apply my+func (cdr numbers))))) 

通知的apply。這是因爲你不能發送(my+func '(2 3))作爲遞歸,但它需要是(my+func 2 3),這就是apply所做的。或者你可以使用列表,而不是一個幫手:

(define (my+func . numbers) 
    (define (helper ns) 
    (if (null? ns) 
     0 
     (+ (car ns) (helper (cdr ns))))) 
    (helper numbers)) 

一般人會選擇同樣的名稱在助手的數字,但我記得我很困惑的是不一樣的陰影變量。