【问题标题】:Global variables and list functions全局变量和列表函数
【发布时间】:2011-11-05 02:29:42
【问题描述】:

函数manageFirstList 应该递归地将一个元素同时复制到全局列表x。

(define test1DataA '(("a" "a") ("b" "b") ("c" "c") ("d" "d") ("e" "ok")))
(define test1DataB '(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("ok" "Ir OK!")))

(define x '())

(define manageFirstList
  (lambda (a b)  
    ((cond ((not (null? b))
            ((append x (car a))
             (manageFirstList (cdr a) b)))))))

(define ff (lambda (a b) (manageFirstList a b)))

(ff test1DataA test1DataB)

但它会导致错误:

car: expects argument of type <pair>; given '()

问题是:

  1. 如何更新全局值“x”?
  2. 如何以正确的方式连接列表?
  3. 我可以像这样调用超过 1 个函数(或者是否有解决方法):

    ((append x (car a))
     (manageFirstList (cdr a) b))
    

编辑:我要做的是创建一个列表,其中包含每个 test1DataA 列表项的第一个值和每个 test1DataB 列表项的第二个值,其中 test1DataA 列表元素的第二个值与其列表的 test1DataB 第一个值相同元素。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    关于您的问题:

    1. 虽然您可以使用(set! x &lt;value&gt;) 从函数内更新全局变量,但您确实不应该这样做,这不是使用Scheme 进行编程的首选方式;相反,您应该从您的过程中返回一个新列表,如有必要,然后将返回的值分配给 x
    2. “正确的方式”是什么意思? append 过程连接两个列表,如果你问我,这是正确的方法:)。您只需这样称呼它:(append a b),其中ab 必须都是列表
    3. 代码错误,因为您在一对额外的括号之间包围了对append 的调用,Scheme 将尝试应用(append ...) 返回的值,就好像它是带有参数(manageFirstList (cdr a) b) 的过程一样,显然它会失败,因为append 返回一个列表,而不是一个过程。也许您应该准确解释“我可以调用多个函数”是什么意思-当然可以,但是您打算做什么?结合两个调用的结果?独立处理结果?

    无论如何,上述过程会因多种原因而失败 - 您没有考虑列表为空的情况,您只是在其中一个列表上重复出现,等等。

    最后,你应该弄清楚程序的预期结果是什么,在用(ff test1DataA test1DataB)调用它之后,你想在x中看到什么值?把它写成你的问题的一部分,因为文本“递归地将一个元素一次复制到全局列表 x”不够清楚。

    编辑:

    好的,这是我回答您问题的机会,希望我理解正确。请注意,我使用assoc 过程在第二个列表中的第一个列表中搜索每个第二个值,因此将第二个列表解释为关联列表:

    (define (manageFirstList lst1 lst2)
      (cond ((null? lst1) '())
            (else (cons (list (caar lst1) (cadr (assoc (cadar lst1) lst2)))
                        (manageFirstList (cdr lst1) lst2)))))
    

    现在,如果您绝对需要更改 x 全局变量的值,只需执行以下操作:

    (define x '())
    (set! x (manageFirstList test1DataA test1DataB))
    

    请注意我是如何完全避免在过程中修改x 的,因为通常这不是解决问题的Scheme 方法。最后x中的值为:

    (("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("e" "Ir OK!"))
    

    【讨论】:

    • 感谢您的解释。我要做的是创建一个列表,其中包含每个 test1DataA 列表项的第一个值和每个 test1DataB 列表项的第二个值,其中 test1DataA 列表元素的第二个值与其列表元素的 test1DataB 第一个值相同。这就是 x 值应该保持的值。
    • 如果您只是按照自己的意愿编写结果列表,而不是用文字解释它,那将会更加清晰。无论如何,我会试一试。
    • 谢谢 :) 您的回答确实帮助我更多地了解了 SCHEME。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多