假设我有一个 recurse 函数,它带有三个参数 x,y,z 。 y和z保持固定,但x是迭代的。我知道如何生成x值列表。如何编写代码以便 recurse 应用于x列表,但y和z保持不变?
我知道 map 就像这样工作,但我不知道如何实现它,因为它只适用于相同大小的列表。我不知道x的长度是多少。我在概念上要做的是在列表(x1,x2,...,xn)上调用 recurse :
recurse x1 y z
recurse x2 y z
recurse xn y z
答案 0 :(得分:1)
只需更改参数y
和z
:
(define (recurse x y z)
(unless (null? x)
;; … use x, y, z
;; then:
(recurse (cdr x) y z)))
或者,您可以定义辅助函数;使用'named 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)
作为lambda
使用的map
函数的替代方法,在Racket中您可以使用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
答案 2 :(得分:1)
您有一个列表'(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
程序应用于所有三个。
答案 3 :(得分:0)
您可以将相同的变量传递给下一个递归,也可以将其完全保留,以便它是一个自由变量。
EG。发送:
(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