《The Little Schemer》流水账

[已注销] 评论 The Little Schemer - 4th Edition 5 2015-03-15 13:48:36

这篇书评可能有关键情节透露

123
123 2015-03-18 00:34:48

您好,vinci ,我是零基础自学scheme,这本The Little Schemer看到第3章【rember】 这里了,关于这个rember的正确递归(第二次)的定义死活想不通,我在苦想递归无果之下百度到你这里的,也不知道问谁,冒昧打扰,希望能得到您的指点,不胜感激。我想不通的是:它解析说找到要去除的那个atom了(tomato),然后之后的递归执行步骤为啥是它现在这样的,在每次引用自身递归之前( cons ( car lat))的这个cons难道不求值的么?它这个本意不是保留之前查找过的非目标值么,然后加上最后的( cdr lat)这个值,组合成一个新的list么?还有它的最后停留或者说返回值的那个步骤又是哪个啊?换句话说,我最不明白的递归的排除和保留值的执行步骤。如果方便请指点一下谢谢!发豆油不方便的话,发我邮箱也行(subenxin@163.com)不胜感激!

[已注销]
[已注销] 2015-03-18 11:07:45

对的,它会先求出(car lat),求到 lat 为 null?(即符合 (null? lat)),然后再以 lat 为 quote() 一步一步重新 cons。这里我有画一个 rember 的图:http://www.douban.com/note/487957220/,不知道对你理解会不会有点帮助。

123
123 2015-03-18 21:03:43

非常感激您的回应,但是问题没有解决,还烦劳心一二:
按照您给链接图和解释——”就保留这个 atom 并判断下一个是否是要删除的元素,然后遇到要删除的元素,就不保留,跳过,继续判断下一个元素,直到 lat 为 null,然后再从尾到头倒序重建 lat。“——1.如果该lat含有n个和atom同样的值,都将被你逐个排除掉,而作者的愿意只是排除第一同样的atom,最多一个哦。请看原文“In our words:
"The function reber checked each atom of
the lat, one at a time, to see if it was the
same as the atom and. If the car was not
the same as the atom, we saved it to be
consed to the fial value later. When
reber found the atom and, it dropped it,
and consed the previous atoms back onto
the rest of the lat."

2.如果按照您说的,那么你将历遍整个list的元素,直到 lat 为 null,可是一旦到了那里,难道返回的不是空list么?!!
3.从你画的图,省掉了”然后遇到要删除的元素,就不保留,跳过“这个计算机具体执行步骤,作者原文那里我也没理解哪里有,我是按照条件触发然后跳转相应结果 这种方式去理解的,这个也是我最不理解的地方。

123
123 2015-03-18 21:10:16

“(rember a lat) takes an atom and a lat as its arguments, and makes a new lat with the first occurrence of the atom in the old lat removed.”

[已注销]
[已注销] 2015-03-18 21:38:38

非常感谢您的指正,我的图和我的文字是不符,我的文字错了,lat 循环只到 (D) 就结束了,图没错

[已注销]
[已注销] 2015-03-18 21:56:54

cond 的意思就是几个问题如果按顺序执行,当有一个 question 为 true,就取相应值,所以当循环执行到 (rember C (C D)) 的时候,先判断 (null? (C D)) 为 False,所以跳到下一个问题:(eq? (car lat) C) = (eq? (car (C D)) C),结果为 True,取值 (cdr lat) = (D),所以就这个 (rember C (C D)) 的值就是 D,就不会进入 else,也不会继续循环下去,所以不会历遍整个 list,只会删除符合条件的第一个 atom。

[已注销]
[已注销] 2015-03-18 21:59:46

另外你的第三点我同意你的理解,我这么说不严谨,不过我是理解为,rember 按顺序 eq? list 的 atom,遇到符合条件的 atom,就跳过该 atom,保留 (cdr lat),然后重新倒序 cons 一个 new lat。

123
123 2015-03-18 23:56:46

我又仔细看了看原文,我以为我找到答案了,再来向求证和分享:
问题出在cons上。cons定律——The primitive cons takes two arguments.
The second argument to cons must be a list.——cons不管多长,最后(最右边)的一定是一个list,哪怕是个空list!!以你写的为例,(D)是递归过程中求得的值,这个值是cons这个最深入最右边的值,在没有求这个值之前,cons是无法成立构成list的,求得这个值(D)之后,cons才能展开回溯(cons (A . B (D))),结果是(A . B . D);在这个过程中,((A) (.B))是之前保留的值,而(C)是刚好在判断相同时候被抛弃的中间值,而(D)是其求得的值。——换句话,我之前说的第3点已经不成立。
如果我上面所说的是对的,那么一个新的问题来了。
cons的优先权到底有多高??!!当cond的条件中求得的真值返回(D)的时候,居然不是函数的最终结果,反而变成了cons中的普通一员!!如果是python的话,好像不可能吧??!!
逻辑混乱中。。。。。。

123
123 2015-03-18 23:59:04

如果这个不是cons,而是其它函数(?),那么还会有这种情况出现么?递归的顺序搞死人了。。。

[已注销]
[已注销] 2015-03-19 00:09:28

1. 其实我觉得不要考虑这么复杂,一步一步求,碰到了 (rember a lat) 就求 (rember a lat),哪个值不知道就求哪个;
2. Python 的确不可能,这里用的 Lisp,即运算符都是在变量之前的;
3. 有个建议,这个地方可以搁置一下,你可以先接着往下看,说不定看到一半这里就解了