我如何使用递归来编写此方案函数?

时间:2017-03-14 00:43:36

标签: recursion scheme

该函数应该接受输入的所有列表,并将它们全部附加在一起,顾名思义。

(AppendAll ( L1   L2 …  Ln))

我无法弄清楚如何进行递归定义。

如果我是正确的,基本情况将是:

((null? L)    '())

我基本上不知道如何接受不确定数量的列表作为参数。基本上是Ln列表。

2 个答案:

答案 0 :(得分:0)

  

apply,apply就是您正在寻找的答案。

使用函数名称无法调用任意数量的参数的函数。

(define L '(1 2 3))
(+ L) ;doesn't work

您需要将+应用于L。

(apply + L) ;evaluates to 6

现在,针对您当前的问题,

(define (append l1 l2)
  (cond
    ((null? l1) l2)
    (else (cons
           (car l1)
           (append (cdr l1) l2)))))
(define append_all
  (lambda x
    (cond
      ((null? x) '())
      (else
       (append (car x)
               (apply append_all (cdr x)))))))
(append_all '(1) '(2) '(2 3))

答案 1 :(得分:0)

如何通过使用rest参数接受不确定数量的参数。几乎所有语言都具有此功能,而在Scheme中,您使用变量而不是带有变量的列表。例如。

(define my-list  
  (lambda arguments
    arguments))
(my-list 1 2 3 4)
; ==> (1 2 3 4) 

也是相同功能的简写define

(define (my-list . arguments)
  arguments)

想象一下,你需要一个带有2个参数的函数,此外还有一个未知数量的参数:

(define (test a b . rest)
  (list a b rest))

(test 1 2 3 4 5)
; ==> (1 2 (3 4 5))

相反的镜像操作也许很有意思,即apply。想象一下,你想要(+10 1 2 3) ; ==> 16并且它应该采用任意数量的参数。可以这样做:

(define (+10 . args)
  (apply + 10 args))

Apply接受一个函数,然后是第二个,直到最后一个参数的下一个参数(可能是none)作为该函数的第一个参数,然后是最后一个参数,它是零个或多个元素正确列表,作为最后一个参数功能。因此:

(apply + 1 2 3 '(4 5 6)) ; ==
(+ 1 2 3 4 5 6)

使用此功能制作的函数的一个共同点是zip

(define (zip . args)
  (apply map list args))

(zip '(1 2 3 4) 
     '(a b c d) 
     '(I II III IV))
; ==> ((1 a I) 
;      (2 b II) 
;      (3 c III) 
;      (4 d IV))

你有unzip,它与zip的作用相同,只是它将列表列表作为一个参数。通过unzip两次传递结果会重新创建一个agrument:

(define (unzip lsts)
  (apply zip lsts))

(unzip '((1 a) (2 b)))
; ==> ((1 2) (a b))
(unzip (unzip '((1 a) (2 b))))
; ==> ((1 a) (2 b))