2014-02-13 37 views
0

假設我有一個函數遞歸,它需要三個參數x,y,z。 y和z保持不變,但x是迭代的。我知道如何生成一個x值列表。我如何編寫代碼以便將遞歸應用於xs列表,但y和z保持不變?計劃 - 如何將遞歸函數應用於可變長度列表

我知道地圖是這樣的工作,但我不知道如何實現它,因爲它只能在相同大小的列表上工作。我不知道x的長度是多少。我試圖從概念上做的是調用遞歸名單上(X1,X2,...,xn)映射爲這樣:

recurse x1 y z 
recurse x2 y z 
recurse xn y z 
+0

你想要結果是什麼?如果你想返回一個列表,你可以將y和z換成一個lambda表達式映射到x:xs。 – WorBlux

回答

0

你要麼相同的變量傳遞給下一個遞歸或離開它完全是這樣的,它是一個自由變量。

例如,發送:

(define (make-list items value) 
    (if (zero? items) 
     '() 
     (cons value (make-list (- items 1) value)))) 

它作爲一個自由變量:

(define (make-list items value) 
    (let loop ((items items)(acc '())) 
    (if (zero? items) 
     acc 
     (loop (- items 1) (cons value acc))))) 

對於更高階的過程中,您也把它作爲一個自由(關閉了)變量:

(define (make-list items value) 
    (map (lambda (x) value) (range items))) ;; value exists in the anonymous functions scope 
1

只是傳遞參數yz不變:

(define (recurse x y z) 
    (unless (null? x) 
    ;; … use x, y, z 
    ;; then: 
    (recurse (cdr x) y z))) 

或者你可以定義一個輔助函數;輕鬆與「命名let`:

(define (recurse x y z) 
    (let recursing ((x x)) 
    ;; … use x, y, z 
    ;; then: 
    (recursing (cdr x)))) 

一個例子:

(define (all-in-range? values min max) 
    (or (null? values) 
     (and (< min (car values) max) 
      (all-in-range? (cdr values) min max)))) 
+1

帶有邏輯連接符的手動編碼版本就是一個很好的例子。 :) –

1

可以使用map

(define (between x y z) (<= x y z)) 

(define (between-list xlist y z) 
    (map (lambda (e) (between e y z)) xlist)) 

> (between-list '(1 20 3 100 99 2) 5 15) 
'(#t #f #t #f #f #t) 

map用於對lambda功能的替代,在球拍中,您可以使用curryr。此外,如果你只是做它的副作用,你可以使用for-each代替map

(define (between x y z) (display (<= x y z))) 

(define (between-list xlist y z) 
    (for-each (curryr between y z) xlist)) 

> (between-list '(1 20 3 100 99 2) 5 15) 
#t#f#t#f#f#t 
1

你有一個清單'(x1 x2 … xn),你想一個函數recurse應用到每個元素xn以及yz 。你沒有說過什麼是回報價值。我會假設沒有回報價值。

(for-each (lambda (x) (recurse x y z)) <your list of x1, … xn>) 

lambda捕獲了yz值,需要提供的x參數,並套用您recurse程序,所有三個。