关于connection broken by remote peer的问题
lisp吧
全部回复
仅看楼主
level 5
j18943192179 楼主
最近刚学lisp,试着用递归和剩余变量来实现一个加法运算(虽然没实际意义,但就当练习了。
函数如下:
1(defun myadd (&rest numbers)
2 (cond ((null numbers) nil)
3 (t (+ (car numbers) (myadd (cdr numbers))))))
思路就是通过对列表numbers的循环实现自定义的加法,但运行后出现:
connection broken by remote peer的提示,如果是我的函数定义错了,那错在哪里了呢?
还有这样的情况是什么原因造成的呢?希望各位不吝赐教。
ps:自己有用迭代算法去实现,结果很好。但是递归就不知道怎么办了。
2013年06月22日 05点06分 1
level 4
提醒一声, (cdr nil) => nil
2013年06月22日 05点06分 2
level 5
j18943192179 楼主
改为0了,但结果还是那样connection broken by remote peer@CScope
2013年06月22日 05点06分 3
(cdr 0) 会报错啊,你必须想清楚你的递归的出口在哪里才行
2013年06月22日 05点06分
补充一下,原来的那个报的是嵌套层次太多,,这个类似于栈溢出
2013年06月22日 05点06分
哦,我有点明白改0不行的原因了,(null '(nil)) => nil
2013年06月22日 06点06分
还是递归出口的问题
2013年06月22日 06点06分
level 4
(defun myadd (&rest num)
(cond
((null num) 0)
(t (+ (car num) (apply #'myadd (cdr num))))))
2013年06月22日 06点06分 4
因为 (cdr num) 本来就是个链表,而 如果把 它直接整个作为 myadd 的&rest参数的话,就会再次 封装成只含有一个元素 (cdr num) 的链表, 而 如果 (cdr num) => nil 的话,就会变成'(nil), 而 (null '(nil)) => nil ,就像一直调用 (reduce (nil)),而无法找到出口
2013年06月22日 06点06分
level 5
j18943192179 楼主
嗯 确实成功了!可是为什么要这样做呢?@CScope
2013年06月22日 09点06分 5
(apply #'myadd (cdr num)) <=> (eval (cons 'myadd (cdr num)))
2013年06月22日 09点06分
我上楼评论里有解释啊,你主要 想清楚 函数参数 &rest 是怎么回事你就能明白了
2013年06月22日 09点06分
level 5
j18943192179 楼主
[大拇指]哦,明白了,原来这样,太谢谢了!
2013年06月22日 09点06分 6
1