【问题标题】:Implement foldr function in Scheme from scratch从零开始在 Scheme 中实现 foldr 功能
【发布时间】:2021-06-04 07:54:44
【问题描述】:

我正在练习方案,我正在研究如何在方案中实现foldr 函数,希望以尾递归的方式实现。

例如:

(my-foldr + 0 '(1 2 3 4)) => 10

(my-foldr list '() '(1 2 3 4)) => '(1 (2 (3 (4 ())))))

我通过在 scheme 中实现 map 开始了我的实践,但我似乎无法获得 foldr。如果有人有任何建议,将不胜感激!提前致谢。

【问题讨论】:

  • 请发布您目前编写的foldr 实现代码,指出给您带来麻烦的确切部分。同时发布示例输入和预期输出。
  • foldr 应该被定义为 (foldr f z [a, ...]) == (f a (foldr f z [...]))(foldr f z []) == z。以后担心效率,特别是。在 Racket (您似乎正在使用)下,将其定义为尾递归 a.o.t 没有任何好处。尾递归模“缺点”(即模f)。

标签: functional-programming scheme racket


【解决方案1】:

这是一个简化的 foldr/ foldl 列表:

(define (my-foldr proc init lst)
  (my-foldl proc init (reverse lst)))

(define (my-foldl proc init lst)
  (if (empty? lst) init
      (my-foldl proc
                (proc (car lst) init)
                (cdr lst))))

更多列表:

(define (my-foldr proc init lst . lsts)
  (apply my-foldl proc init (reverse lst) (map reverse lsts)))

(define (my-foldl proc init lst . lsts)
  (if (empty? lst) init
      (apply my-foldl proc
                (apply proc (append (list (car lst))
                                    (map car lsts)
                                    (list init)))
                (cdr lst)
                (map cdr lsts))))

例子:

(my-foldl (lambda (a b result)
           (* result (- a b)))
         1
         '(1 2 3)
         '(4 5 6))` => -27

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多