是否可以对前一个函数执行操作,我有一个值列表说(1,2,3,4,5),第一个函数需要将它们乘以2,而第二个函数将结果加1之前的函数,所以首先我们得到(2,4,6,8,10),然后(3,5,7,9,11)我得到了这个,函数g做了额外的工作,是否可能而不是做对元素的操作在函数F上执行,或者在函数F
中执行#lang racket
(define test (list 1 1 2 3 5))
(define (F)
(map (lambda (element) (* 2 element))
test))
(define (G)
(map (lambda (element) (+ 1 (* 2 element)))
test))
答案 0 :(得分:2)
首先,您需要正确定义过程以获取列表参数(在本例中称为lst
):
(define (F lst)
(map (lambda (e) (* 2 e)) lst))
(define (G lst)
(map add1 lst))
然后
> (F '(1 2 3 4 5))
'(2 4 6 8 10)
> (G '(2 4 6 8 10))
'(3 5 7 9 11)
或者,如果您需要结合这两个程序:
> (G (F '(1 2 3 4 5)))
'(3 5 7 9 11)
答案 1 :(得分:1)
这是previous question的后续行动。正如我在那里的回答所述,你应该将正确的参数传递给函数 - 特别是将输入列表作为参数传递,这样你就可以使用一个函数的结果作为下一个函数的输入:
(define test (list 1 1 2 3 5))
(define (multiply-list test)
(map (lambda (element) (* 2 element))
test))
(define (add-list test)
(map (lambda (element) (+ 1 element))
test))
现在,如果我们想在输入列表中的每个元素中添加一个:
(add-list test)
=> '(3 3 5 7 11)
或者,如果我们想在输入列表中将每个元素乘以2:
(multiply-list test)
=> '(2 2 4 6 10)
如果我们想先添加一个,然后乘以2,我们可以链接函数!一个的结果成为另一个的输入,最终结果如下:
(multiply-list (add-list test))
=> '(6 6 10 14 22)
答案 2 :(得分:0)
NB!你有标记方案,但你使用球拍(语言)。并非我的所有示例都适用于计划。
是的!你甚至可以在G
的定义中自己做,你可以在其中添加一个值和乘法的结果。
可以链图
(map f3 (map f2 (map f1 lst)))
因此,如果您改为创建一个列表并将其加倍的函数:
(define (list-double lst)
(map (lambda (x) (* x 2)) lst))
你可以将它链接到四倍:
(define (list-quadruple lst)
(list-double (list-double lst)))
如果你可以避免它,现在链表不是最佳选择。相反,你可以一起编写程序:
(define (double x) (* x 2))
(define (list-quadrouple lst)
(map (compose1 double double) lst))
compose1
这里与创建链接参数的匿名函数相同。例如。最后一个是(lambda (x) (double (double x)))
。更复杂的compose
可以在过程之间执行多个值。例如。 (compose + quotient/remainder)