Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 从头开始在Scheme中实现foldr功能_Functional Programming_Scheme_Racket - Fatal编程技术网

Functional programming 从头开始在Scheme中实现foldr功能

Functional programming 从头开始在Scheme中实现foldr功能,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,我正在练习scheme,我正在研究如何在scheme中实现foldr函数,希望能以尾部递归的方式实现 例如: (我的文件夹+0'(1234))=>10 (我的文件夹列表“()”(1234))=>”(1(2(3(4)()))) 我通过在scheme中实现map开始了我的实践,但我似乎无法获得foldr。如果有人有任何建议,我们将不胜感激!提前感谢。这是简化的foldr/foldl,仅用于一个列表: (define (my-foldr proc init lst) (my-foldl proc

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

例如:

(我的文件夹+0'(1234))=>10

(我的文件夹列表“()”(1234))=>”(1(2(3(4)())))


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

这是简化的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

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