【发布时间】:2014-05-11 17:56:29
【问题描述】:
我正在尝试编写一个函数,它接受一个列表 (x) 和一个数字 (y),并删除列表中该数字的每次出现。前任。 (deepdeleting '(0 0 1 2 0 3 0) 0) ===> '(1 2 3) 到目前为止,这是我所拥有的:
(define (deepdeleting x y)
(if (pair? x)
(if (eqv? (car x) y)
(begin
(set! x (cdr x))
(deepdeleting x y)
)
(deepdeleting (cdr x) y) ; else
)
x ; else
)
)
代码有效,但我的问题是我希望它修改原始列表,而不仅仅是返回一个新列表。现在是这样的:
> (define list '(0 0 1 2 0 3 0))
> (deepdeleting list 0)
(1 2 3)
> list
(0 0 1 2 0 3 0) ; <<< I want this to be (1 2 3)
这对我来说似乎很奇怪,因为这两个设定车!和设置-cdr!功能似乎改变了输入列表,而设置!不...
任何见解将不胜感激!
【问题讨论】:
-
你永远不会修改
list,只修改变量x。此外,一些 Scheme 不允许文字列表的变异。 -
好吧,那有什么区别可以让set-car!然后更改列表?
-
set-car!和set-cdr!改变了这对。set!更改最里面的绑定。到列表的绑定指向第一对,procedur 参数是它自己的绑定。 IE。您正在更改本地 x 并且从不列出。 -
所以,为了确保我理解......以 x 开头,并且 list 绑定到同一个文字列表,但是当我 !set x 我将它绑定到一个新列表,它有不影响list的绑定?
-
我仍然对固定车感到困惑!和设置-cdr!虽然部分...你是说对是可变的,而列表不是?
标签: functional-programming scheme r5rs