创建一个接受任意数量的函数作为参数的函数
Creating a function which takes any number of functions as arguments
我无法弄清楚如何创建一个可以将一系列 相同 函数作为参数的函数最后一个参数作为操作数。例如:
(func sqrt sqrt sqrt 390625)
上面的调用应该 return 5 as (sqrt 390625) > (sqrt 625) > (sqrt 25) > 5
我无法弄清楚我应该如何写这篇文章,因为我尝试过的任何方式都给我错误或实现了无限循环。
这段代码目前有:
(define func
(lambda L
(cond ( (equal? (length L) 2) ((car L) (cadr L)) ) ;; If the list consists of only 2 elements, carry out the function (element 1) onto the operand (element 2)
( #t (apply (car L) (func (cdr L))) ) ;; otherwise, apply the function (1st element) onto the rest of the list
)
)
)
第一个条件有效,例如 returning 5 如果我调用 (func sqrt 25)
,但是递归调用会抛出错误。
如有任何帮助,我将不胜感激。
OP 没有提供 chain
的定义,所以这部分不清楚,但我认为这里的一个基本问题是没有对 func
的递归调用;此外,apply
没有用在正确的位置。
与其使用 (equal (length L) 2)
作为基本情况,只要输入中的第一个元素是过程,或者只是 return 元素,进行递归调用可能会更好:
#lang racket
(define multi-call
(lambda args
(let ((arg (car args)))
(if (procedure? arg)
(arg (apply multi-call (cdr args)))
arg))))
在这里,当 arg
是一个过程时,它会应用于对剩余参数递归调用 multi-call
的结果。请注意,multi-call
接受任意数量的参数,将它们包装在列表 args
中。缩减步骤提供 (cdr args)
,这是一个 list 的剩余参数。这意味着 apply
应该用于调用 multi-call
那些剩余的参数,因为 multi-call
需要任意数量的参数,而不是参数列表。
multi-call.rkt> (multi-call sqrt sqrt sqrt 390625)
5
我无法弄清楚如何创建一个可以将一系列 相同 函数作为参数的函数最后一个参数作为操作数。例如:
(func sqrt sqrt sqrt 390625)
上面的调用应该 return 5 as (sqrt 390625) > (sqrt 625) > (sqrt 25) > 5
我无法弄清楚我应该如何写这篇文章,因为我尝试过的任何方式都给我错误或实现了无限循环。
这段代码目前有:
(define func
(lambda L
(cond ( (equal? (length L) 2) ((car L) (cadr L)) ) ;; If the list consists of only 2 elements, carry out the function (element 1) onto the operand (element 2)
( #t (apply (car L) (func (cdr L))) ) ;; otherwise, apply the function (1st element) onto the rest of the list
)
)
)
第一个条件有效,例如 returning 5 如果我调用 (func sqrt 25)
,但是递归调用会抛出错误。
如有任何帮助,我将不胜感激。
OP 没有提供 chain
的定义,所以这部分不清楚,但我认为这里的一个基本问题是没有对 func
的递归调用;此外,apply
没有用在正确的位置。
与其使用 (equal (length L) 2)
作为基本情况,只要输入中的第一个元素是过程,或者只是 return 元素,进行递归调用可能会更好:
#lang racket
(define multi-call
(lambda args
(let ((arg (car args)))
(if (procedure? arg)
(arg (apply multi-call (cdr args)))
arg))))
在这里,当 arg
是一个过程时,它会应用于对剩余参数递归调用 multi-call
的结果。请注意,multi-call
接受任意数量的参数,将它们包装在列表 args
中。缩减步骤提供 (cdr args)
,这是一个 list 的剩余参数。这意味着 apply
应该用于调用 multi-call
那些剩余的参数,因为 multi-call
需要任意数量的参数,而不是参数列表。
multi-call.rkt> (multi-call sqrt sqrt sqrt 390625)
5