方案函数将函数应用于列表中的所有元素,无论其深度如何,同时保留列表的结构



嘿,我正在研究一个关于将函数应用于列表中的每个元素的家庭作业问题,根据需要尽可能深入。

我在打电话时遇到错误(乐趣(汽车 l)),那

mcar: expects argument of type <mutable-pair>; given 5

然而当我只是打电话(有趣的l)时,我得到错误+: 期望类型为第一个参数,给定:(5);其他论点是:1

   (define (map-gen fun l)
    (if (null? fun) l 
        (if (null? l) '()
            (if (list? (car l))
                (append (map-gen fun (cdr l)) (map-gen fun (car l)))
                (append (map-gen fun (cdr l)) (fun (car l)))))))

感谢任何和所有的帮助!

编辑:这是在调用函数时,如下所示:

(map-gen (lambda (x) (+ x 1))'(1 (2 (3 4))(((5)))))
你有向

后追加的论据,我认为缺点会是一个更好的选择。 此外,检查乐趣是否为空是不必要的。

(define (map-gen fun l)
   (if (null? l) '()
       (if (list? (car l))
           (cons (map-gen fun (car l)) (map-gen fun (cdr l)))
           (cons (fun (car l)) (map-gen fun (cdr l))))))

此外,正如 Eli 在他的回答中所说,你真的应该研究 cond 而不是嵌套的 ifs。 它更加优雅,使您的代码更具可读性。

您有几个问题:

  • fun输入应该是一个函数,所以问(null? fun)没有多大意义,

  • 你对嵌套if s的使用正是cond更优雅地解决的事情,

  • 正如基恩所说,当你以这种方式处理解构列表时,cons更合适,

  • (list? (car l))是坏的——这时你知道l不是空列表,但如果它根本不是列表怎么办?

解决此问题的一个好方法是考虑需要处理的l输入类型:

  • 它可以是空列表,在这种情况下,答案很简单,

  • 它可以是一对(最好用 pair? 进行测试,尽管如果您不担心"不正确的列表",list?也可以工作),在这种情况下,您需要对其carcdr做一些事情,并以与原始结构匹配的方式组合结果(这很容易),

  • 或者它可以是其他东西(这种情况也很容易)。

最好从编写几个示例开始,说明您希望它如何运行,然后填写代码以实现它,最后将这些示例转换为测试用例,以验证您的解决方案是否正常工作。 你真的应该看到HtDP - 它所谈论的"设计配方"使解决这些问题变得如此简单,以至于解决方案实际上会自己编写。 (鉴于您在某些课程中正在这样做,向您的老师指出这一点可能是个好主意。

最新更新