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