【问题标题】:Scheme function applying a function to all elements in a list, no matter how deep, while preserving the structure of the listScheme函数将函数应用于列表中的所有元素,无论多深,同时保留列表的结构
【发布时间】:2011-05-20 18:46:30
【问题描述】:

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

我在调用 (fun (car l)) 时遇到错误,

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

然而,当我调用 (fun 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)))))

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    你已经得到了向后追加的论点,我认为 cons 会是一个更好的选择。另外,检查 fun 是否为 null 是不必要的。

    (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。它更加优雅,让您的代码更具可读性。

    【讨论】:

      【解决方案2】:

      你有几个问题:

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

      • 您对嵌套ifs 的使用正是cond 更优雅地解决的那种事情,

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

      • 询问(list? (car l)) 是错误的——此时您知道l 不是空列表,但如果它根本不是列表怎么办?

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

      • 它可以是空列表,那么答案很简单,

      • 它可以是一对(最好用pair? 测试,虽然list? 也可以工作,如果你不担心“不正确的列表”),在这种情况下你需要做一些事情它的car 和它的cdr 并以匹配原始结构的方式组合结果(这很容易),

      • 也可以是别的东西(这种情况也很简单)。

      最好先编写几个示例来说明您希望它如何运行,然后填写代码以实现它,最后将示例转换为测试用例以验证您的解决方案是否有效。你真的应该看到HtDP ——它谈到的“设计秘诀”使得解决这些问题变得如此容易,以至于解决方案实际上可以自己编写。 (鉴于您在某些课程中这样做,向您的老师指出这一点可能是个好主意。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 2020-11-30
        • 2019-05-03
        • 1970-01-01
        相关资源
        最近更新 更多