【问题标题】:Make a function in Scheme to substract two lists在 Scheme 中创建一个函数来减去两个列表
【发布时间】:2016-10-26 22:26:54
【问题描述】:

我对 Scheme 和 StackOverflow 也很陌生! 所以,对于第一次接触,我想在 Scheme 中做一些简单易行的事情。 我想定义一个函数,减去引入列表的元素。

例如,输入应该是:(sub '(4 12 6) '(0 6 3)) 输出应该是:(4 6 3)

谢谢!!

【问题讨论】:

    标签: list function scheme


    【解决方案1】:

    您需要有一个基本情况,您可以检查其中一个列表是否为空并将其评估为空列表,或者您通过计算每个列表的第一个元素和其余部分的递归进行配对两个列表。基本上你会得到:

    (cons (- 4 0) (cons (- 12 6) (cons (- 6 3) '()))) ; ==> (4 6 3)
    

    作为递归列表处理函数的一个例子,这里是一个否定所有元素的函数:

    (define (negate-list lst)
      (if (null? lst)
          '()
          (cons (- (car lst)) 
                (negate-list (cdr lst)))))
    
    (negate-list '(1 2 3 4)) ; ==> (-1 -2 -3 -4)
    

    现在有更多奇特的方法可以做到这一点。例如,。你可以使用尾递归:

    (define (negate-list lst)
      (let loop ((lst lst) (acc '()))
        (if (null? lst)
            (reverse acc)
            (loop (cdr lst)
                  (cons (- (car lst)) acc)))))
    

    你可以使用map:

    (define (negate-list lst)
      (map - lst))
    

    所以你去。你已经成功了一半。

    【讨论】:

    • 您好 Sylwester,非常感谢您的回答。这对我很有帮助。我还有一个问题:为什么这有效?:(定义(negate-list lst lst2)(map - lst lst2))(negate-list'(11 12 13 14)'(1 2 3 4))并且这没有' T?: (define (sub-one lst) (map - lst 1)) (sub-one '(11 12 13 14)) 我如何定义一个简单的函数来从给定列表中提取一个?谢谢
    • @JackGreen map 第二到 n 个参数需要是列表,因为它将过程应用于每个参数的第一个元素。 (car 1)(cdr 1) 是什么?你可以这样做:(map (lambda (e) (- e 1)) '(11 12 13 14)) ;==> (10 11 12 13)
    • 感谢您的回答西尔韦斯特!这真的很有帮助。再来一个查询,为什么它不起作用?:(define (next lst)) (map (lambda (e) (+ e 1)) (next '(1 2 3 4))。输出应该是 (2 3 4 5)
    • @JackGreen 它不起作用的原因是因为你有 define 但你的 map 表达式在它之外。与我的评论不同,您的 map 中没有任何列表参数
    • 我已经工作了几个小时,但我无法完成这项工作:(define (next lst) (map (lambda (lst) (+ lst 1)))) 它既不工作而且我不知道如何解决它...任何帮助,请。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多