Scheme - 如何将递归函数应用于可变长度列表

时间:2014-02-13 01:53:47

标签: recursion scheme

假设我有一个 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

4 个答案:

答案 0 :(得分:1)

只需更改参数yz

(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以及yz。你还没有说出返回值是什么。我会假设没有回报值。

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

lambda捕获yz的值,获取提供的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