Scheme的新手,尝试编写一个接受列表的函数,并将三项作为输入,将item1替换为item2,使用let
临时命名,然后反转此临时列表并将item3添加到末尾。
这仅用于修改Scheme,而不是作业问题。任何建议表示赞赏:
我尝试使用let*
失败,并删除了cond
仍然徒劳。
(define (itemreplacer item1 item2 item3 leest)
(cond (
(eq? (car leest) item1)
(cons item2 (cdr leest)))
(else
(let
(
(templist (cons item1 (itemreplacer (cdr (leest))))))
(reverse (cons item3 templist))))))
它可以工作到item2替换item1的程度,并且仅将其显示为输出。不知何故,reverse
行无法运行。
答案 0 :(得分:1)
let
表达式很好,这不是问题。该代码还有更严重的问题:
equal?
进行比较(比较笼统)(leest)
itemreplacer
let
),以累积部分结果,直到找到item1
由于最后一项,我不得不重写过程的逻辑以满足要求:
(define (itemreplacer leest item1 item2 item3)
(replacer-helper leest item1 item2 item3 '()))
(define (replacer-helper leest item1 item2 item3 acc)
(cond ((null? leest) (reverse acc))
((equal? (car leest) item1)
(append (reverse (cdr leest)) (cons item2 acc) (list item3)))
(else
(replacer-helper (cdr leest) item1 item2 item3 (cons (car leest) acc)))))
现在它可以正常工作了:
(itemreplacer '(1 2 4 6 7 8 9 10) 6 5 3)
=> '(10 9 8 7 5 4 2 1 3)
未指定item1
的情况下的行为是不确定的,所以我只返回原始输入:
(itemreplacer '(1 2 4 6 7 8 9 10) 13 5 3)
=> '(1 2 4 6 7 8 9 10)