该函数应该接受输入的所有列表,并将它们全部附加在一起,顾名思义。
(AppendAll ( L1 L2 … Ln))
我无法弄清楚如何进行递归定义。
如果我是正确的,基本情况将是:
((null? L) '())
我基本上不知道如何接受不确定数量的列表作为参数。基本上是Ln列表。
答案 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))