Scheme自定义my-append函数输出正确性咨询
你的
my-append函数其实是正确的!输出的“奇怪”只是显示方式问题 嘿,作为Scheme新手碰到这种看起来“怪异”的输出太正常了,咱们一步步拆解清楚到底怎么回事~
首先给你吃个定心丸:你的my-append函数逻辑完全正确,输出结果和你预期的拼接效果是等价的,只是DrRacket的Advanced student语言用了更“直白”的方式展示quote表达式而已。
先拆解你的测试用例
你调用的代码是:
(my-append '(a b '(1 2 3)) (list '(4 5 6) 7 8 9))
这里要明确几个Scheme基础知识点:
'(a b '(1 2 3))是(quote (a b '(1 2 3)))的语法糖,展开后等价于(list 'a 'b (quote (1 2 3)))'(4 5 6)同理等价于(quote (4 5 6)),所以(list '(4 5 6) 7 8 9)就是(list (quote (4 5 6)) 7 8 9)
为什么输出看起来“奇怪”?
DrRacket的Advanced student语言为了让新手更直观理解表达式的底层结构,会把所有语法糖(比如')展开成最基础的list形式显示:
(quote (1 2 3))会被显示为(list 'quote (list 1 2 3)),因为quote本身是一个符号,(quote (1 2 3))本质就是把quote和列表(1 2 3)组成的新列表。
所以你看到的输出:
(list 'a 'b (list 'quote (list 1 2 3)) (list 4 5 6) 7 8 9)
完全等价于你预期的:
(a b '(1 2 3) '(4 5 6) 7 8 9)
怎么验证正确性?
你可以在DrRacket里运行下面的代码确认:
(equal? (my-append '(a b '(1 2 3)) (list '(4 5 6) 7 8 9)) '(a b '(1 2 3) '(4 5 6) 7 8 9))
它会返回#t,这就证明你的函数输出和预期结果完全相等。
(可选)让输出更简洁的方法
如果你想看到更符合直觉的'语法糖显示,可以把DrRacket的语言从Advanced student切换到Racket(左上角语言选择器里),这样输出就会显示成你预期的(a b '(1 2 3) '(4 5 6) 7 8 9)了。
最后聊聊你的函数实现
虽然你的函数是正确的,但要注意:append-element是O(n)操作,每次给L1加元素都要遍历整个L1,所以my-append的整体时间复杂度是O(n*m)(n是L1的长度,m是L2的长度)。不过你提到自己受限只能用这些操作,这个实现逻辑清晰、完全符合要求,给你点个赞~
内容的提问来源于stack exchange,提问作者Drawkcab Esrever
相关产品推荐
相关产品推荐

