假設我有一個函數遞歸,它需要三個參數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
假設我有一個函數遞歸,它需要三個參數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
你要麼相同的變量傳遞給下一個遞歸或離開它完全是這樣的,它是一個自由變量。
例如,發送:
(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
只是傳遞參數y
和z
不變:
(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))))
帶有邏輯連接符的手動編碼版本就是一個很好的例子。 :) –
您可以使用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
你有一個清單'(x1 x2 … xn)
,你想一個函數recurse
應用到每個元素xn
以及y
和z
。你沒有說過什麼是回報價值。我會假設沒有回報價值。
(for-each (lambda (x) (recurse x y z)) <your list of x1, … xn>)
的lambda
捕獲了y
和z
值,需要提供的x
參數,並套用您recurse
程序,所有三個。
你想要結果是什麼?如果你想返回一個列表,你可以將y和z換成一個lambda表達式映射到x:xs。 – WorBlux