Recursion 我能';t获取一个Scheme函数递归调用嵌套列表上的f以获得正确的结果

Recursion 我能';t获取一个Scheme函数递归调用嵌套列表上的f以获得正确的结果,recursion,scheme,nested-lists,Recursion,Scheme,Nested Lists,我最近在一个班上参加了一次考试,但考得不太好。然而,由于其他人也对这个计划进行了轰炸,我们的教授愿意通过向她证明我们知道这个计划(不太擅长…)来给我们一些“弥补”点。不过,她会问与考试内容不同的问题。因此,我正在研究考试中的问题,以便更好地使用Scheme,但我似乎无法让下面的问题发挥作用 编写一个采用两个参数的Scheme函数reduce:采用单个参数的函数f和任意值的函数x。reduce函数使用x中包含的每个嵌套列表递归调用f,然后用调用f的结果替换原始嵌套列表 例如,调用(reduce(l

我最近在一个班上参加了一次考试,但考得不太好。然而,由于其他人也对这个计划进行了轰炸,我们的教授愿意通过向她证明我们知道这个计划(不太擅长…)来给我们一些“弥补”点。不过,她会问与考试内容不同的问题。因此,我正在研究考试中的问题,以便更好地使用Scheme,但我似乎无法让下面的问题发挥作用

编写一个采用两个参数的Scheme函数reduce:采用单个参数的函数f和任意值的函数x。reduce函数使用x中包含的每个嵌套列表递归调用f,然后用调用f的结果替换原始嵌套列表

例如,调用(reduce(lambda(x)(cons'list x))(3(78 2 3)))应该返回:

"(列表3 7 9 z s)(列表3(列表78 2 3))

另外,调用(reduce(lambda(x)(cdrx))'(379zs(3(7823)))应该返回:

'(7 9 z s((2 3))),其中第一个元素从每个嵌套列表中删除

这是我想出的代码:

(define reduce
  (lambda (f x)
    (if (null? x)'()
    (let ((var (car x)))
    (cond
      ((cons? var) (cons (f var) (reduce f (cdr x))))
      ((symbol? var) (cons var (reduce f (cdr x))))
      ((number? var) (cons var (reduce f (cdr x)))))))))
如果我输入示例输入,这些是我的结果:

减少(lambda(x)(cons"list x)"(3(78 2 3))

(列表3 7 9’z(列表3(列表78 2 3)))

有一个额外的“名单”来自谁知道在哪里

)

(减少(λ(x)(cdrx))'(379zs(3(7823)))

(列表379'z(列表7823)))

它只删除第二个嵌套循环中的3。它应该去除第一个3,中间3个,第三个78。它也不应该有“列表”这个词

)

我假设问题已经出现((cons?var),但我似乎不知道如何解决它

我们没有深入研究Scheme语言,所以我们没有学习很多特殊的方法;主要是递归

任何帮助都将不胜感激


谢谢。

以下是我的实现:

(define (reduce f x)
  (define (inner x)
    (if (list? x)
        (f (map inner x))
        x))
  (inner x))
示例:

> (reduce (lambda (x) `(list ,@x)) '(3 7 9 z s (3 (78 2 3))))
(list 3 7 9 z s (list 3 (list 78 2 3)))
> (reduce cdr '(3 7 9 z s (3 (78 2 3))))
(7 9 z s ((2 3)))

这是一个不直接使用
map
的版本,但基本上是重新实现
map
(尽管使用了硬编码的转换器):


哇,这看起来容易多了。不幸的是,我们从未讨论过“map”,但是,还有没有其他方法没有它呢?@user2869231好的,代码会稍微长一点,但这里有一个版本基本上为您重新实现了
map
。您将cons的第一部分作为一个单独的函数。这比我尝试的更容易我很忙,谢谢!
(define (reduce f x)
  (define (transform lst)
    (if (null? lst)
        '()
        (cons (process (car lst)) (transform (cdr lst)))))
  (define (process x)
    (if (list? x)
        (f (transform x))
        x))
  (process x))