找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 679|回复: 8

[已解决] 求助递归问题

[复制链接]

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-15 08:40:48 | 显示全部楼层 |阅读模式
悬赏20D豆已解决
(defun _test(lst)
        (if lst
                (cons (list (car lst) (cadr lst)) (_test (cddr lst)))
        )
)

以上函数要实现将表分成两两成组的子表,
如将表'(1 2 3 4 5 6)->'((1 2)(3 4)(5 6))
单个函数测试时,未提示有异常,在多个函数测试效率时,出现了异常。
“无效的数据类型或数据溢出: #<SUBR @000000006cbc1ef8 T>”
本人对递归不懂,望指教!

最佳答案

查看完整内容

这个函数没问题,“多个函数测试”是什么意思?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-5-15 08:40:49 | 显示全部楼层
这个函数没问题,“多个函数测试”是什么意思?

点评

(defun c:tt(/ lst) (setq lst '(1 2 3 4 5 6)) (repeat 5 (xd::quickbench '((_test lst)(XD::List:Divide_2 lst)(XD::List:EvenPair lst)(XD::List:Measure lst 2)(XD::List:Combin  详情 回复 发表于 2020-5-15 10:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-5-15 10:05:56 | 显示全部楼层
pxr201419 发表于 2020-5-15 09:59
这个函数没问题,“多个函数测试”是什么意思?

(defun c:tt(/ lst)
        (setq lst '(1 2 3 4 5 6))
        (repeat 5
                  (xd::quickbench '((_test lst)(XD::List:Divide_2 lst)(XD::List:EvenPair lst)(XD::List:Measure lst 2)(XD::List:CombineSubList lst 2))
                )
        )
        (princ)
)
从本论坛里搜索了几个功能相同的函数,联合测试函数的效率。
去掉_test函数就正常,说明_test函数有问题

点评

正常啊........................  详情 回复 发表于 2020-5-15 10:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-5-15 10:32:53 | 显示全部楼层
不知道哪里出问题了,昨天测试一直有问题,今天测试就没问题了。
(defun c:tt(/ lst)
        (setq i 0)
        (repeat 1000
                (setq lst (cons (setq i (1+ i)) lst))
        )
        (repeat 5
                (xd::quickbench '((_test lst)(XD::List:Divide_2 lst)(XD::List:EvenPair lst)(XD::List:Measure lst 2)(XD::List:CombineSubList lst 2))
                )
        )
        (princ)
)

CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking .......... done for 2048 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST LST)                       2048      1687       1687      6.81 <fastest>
(XD::LIST:DIVIDE_2 LST)           2048      1828       1828      6.29
(XD::LIST:EVENPAIR LST)            512      1016       4064      2.83
(XD::LIST:MEASURE LST 2)           512      1344       5376      2.14
(XD::LIST:COMBINESUBLIST ...)      256      1437      11496      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking .......... done for 2048 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST LST)                       2048      1750       1750      6.22 <fastest>
(XD::LIST:DIVIDE_2 LST)           2048      1844       1844      5.90
(XD::LIST:EVENPAIR LST)            512      1015       4060      2.68
(XD::LIST:MEASURE LST 2)           512      1344       5376      2.02
(XD::LIST:COMBINESUBLIST ...)      256      1360      10880      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking .......... done for 2048 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST LST)                       2048      1750       1750      6.43 <fastest>
(XD::LIST:DIVIDE_2 LST)           2048      1906       1906      5.91
(XD::LIST:EVENPAIR LST)            512      1000       4000      2.81
(XD::LIST:MEASURE LST 2)           512      1359       5436      2.07
(XD::LIST:COMBINESUBLIST ...)      256      1407      11256      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking .......... done for 2048 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST LST)                       2048      1765       1765      6.38 <fastest>
(XD::LIST:DIVIDE_2 LST)           2048      1844       1844      6.10
(XD::LIST:EVENPAIR LST)           1024      2047       4094      2.75
(XD::LIST:MEASURE LST 2)           512      1312       5248      2.14
(XD::LIST:COMBINESUBLIST ...)      256      1407      11256      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking .......... done for 2048 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST LST)                       2048      1719       1719      6.62 <fastest>
(XD::LIST:DIVIDE_2 LST)           2048      1890       1890      6.02
(XD::LIST:EVENPAIR LST)            512      1047       4188      2.72
(XD::LIST:MEASURE LST 2)           512      1328       5312      2.14
(XD::LIST:COMBINESUBLIST ...)      256      1422      11376      1.00 <slowest>
-------------------------------------------------------------------------------

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-5-15 10:38:03 | 显示全部楼层
dyjwyqz5221 发表于 2020-5-15 10:05
(defun c:tt(/ lst)
        (setq lst '(1 2 3 4 5 6))
        (repeat 5

正常啊........................

点评

谢谢了  详情 回复 发表于 2020-5-15 10:40

评分

参与人数 1D豆 +5 收起 理由
dyjwyqz5221 + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-5-15 10:40:16 | 显示全部楼层
pxr201419 发表于 2020-5-15 10:38
正常啊........................

谢谢了

点评

用你这个函数来说,我对递归的理解是这样的,lst是(1 2 3 4 5 6),(cddr lst)是(3 4 5 6), (_test (cddr lst))是对(3 4 5 6)分好组,现在要做的就是把(1 2)加到已经分组的((3 4)(5 6))前面。也是一知半解,对与不对  详情 回复 发表于 2020-5-15 10:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-5-15 10:49:24 | 显示全部楼层
本帖最后由 pxr201419 于 2020-5-15 10:53 编辑

用你这个函数来说,我对递归的理解是这样的,lst是(1 2 3 4 5 6),(cddr lst)是(3 4 5 6), (_test (cddr lst))是对(3 4 5 6)分好组,现在要做的就是把(1 2)加到已经分组的((3 4)(5 6))前面。比如下面是3个一组的分
(defun _test  (lst)
   (if lst
      (cons (list (car lst) (cadr lst) (caddr lst)) (_test (cdddr lst)))))
;;;(_test '(1 2 3 4 5 6))-->((1 2 3)(4 5 6))
也是一知半解,对与不对,共同学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2020-5-15 10:53:41 | 显示全部楼层
本帖最后由 Lisphk 于 2020-5-15 10:57 编辑

使用递归的缺点就是受退栈的限制

楼主,你测试下 1万个,2万个,4万个元素的表,看看能出来结果不
我测试4万个,就退栈溢出了

(setq i 0)
(repeat 40000 (setq ii (cons (setq i (1+ i)) ii))
命令: (_test ii)
出现硬错误 ***
已达内部堆栈限制 (模拟)

点评

递归就存在这个问题,只是多了一种方法而已,不推荐使用。 之前我测试出问题也是因为堆栈溢出所致。  详情 回复 发表于 2020-5-18 08:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-5-18 08:41:48 | 显示全部楼层
Lisphk 发表于 2020-5-15 10:53
使用递归的缺点就是受退栈的限制

楼主,你测试下 1万个,2万个,4万个元素的表,看看能出来结果不

递归就存在这个问题,只是多了一种方法而已,不推荐使用。
之前我测试出问题也是因为堆栈溢出所致。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 01:05 , Processed in 0.186520 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表