Racket 中的映射函数采用一个函数和一个列表,并将该函数递归地应用于列表中的每个项目。我正在尝试将映射转换为尾递归函数,这该如何完成?
你被困在哪里了?您可以定义自己的map
程序与内部loop
程序。
(define (map f in)
(define (loop out lst)
(if #|exit condition here|#
#|return output|#
(loop (cons #|add to output|# out)
#|sub problem|#)))
(loop null in)) ; run the loop
(map (lambda (x) (* x x)) '(1 2 3 4 5))
'(1 4 9 16 25)
这种模式在球拍中非常常见,因此有一个名为let
使我们更容易使用的语法。
(define (map f in)
(let loop ((out null) (lst in))
(if #|exit condition here|#
#|return output|#
(loop (cons #|add to output|# out)
#|sub problem|#))))
另一种选择是使用延续。
(define (map f in)
(let (loop (return identity) (lst in))
(if #|exit condition|#
(return null)
(loop (lambda (out) (return (cons #|add to output|# out)))
#|sub problem|#))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)