对函数的Scheme操作

时间:2014-09-09 19:48:43

标签: scheme

是否可以对前一个函数执行操作,我有一个值列表说(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))

3 个答案:

答案 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)