明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2806|回复: 7

小练习 --插入新的元素到一个有序的数列中。

[复制链接]
发表于 2012-6-21 23:29:00 | 显示全部楼层 |阅读模式
本帖最后由 highflybird 于 2012-6-21 23:30 编辑

国外的题目:
写一个简短的程序,插入一个新的数值到一个排好序的表中。
假如: 已有表'(10000 9000 8000 7000 6000)
现在有一个新的记录,8500,要插入进来,变成表'(10000 9000 8500 8000 7000 )
维持表的长度不变,那个最小的被移走了。
如果新记录比表中元素都小,则表不变。
以下原文(我只是意译)
How to write the shortest lisp using mapcar or lambda to insert a value into a list. Say I have 5 scores - (list 10000 9000 8000 7000 6000). And a new high score of 8500 to insert into this list, meaning the result is 10000 9000 8500 8000 7000. Always end with 5 highest score only, notice the last item in the list 6000 is removed from the list. I have written a lisp but its quite long. I wondered if using mapcar or lambda will shorten the lisp ??

呵呵,欢迎大家练习一下。

格式例如如下:
(f '(9 8 7 6 5 3) 1)  ; (9 8 7 6 5 3)
(f '(9 8 7 6 5 3) 10) ; (10 9 8 7 6 5)
(f '(9 8 7 6 5 3) 3)  ; (9 8 7 6 5 3)
(f '(9 8 7 6 5 3) 5)  ; (9 8 7 6 5 5)
(f '(9 8 7 6 5 3) 4)  ; (9 8 7 6 5 4)
(f '(9 8 7 6 5 3) 9)  ; (9 9 8 7 6 5)





该贴已经同步到 highflybird的微博

点评

看到高飞好像找到了组织  发表于 2012-6-21 23:33
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-6-21 23:32:00 | 显示全部楼层
本帖最后由 yjr111 于 2012-6-22 00:51 编辑

沙发!耶!!!!!!!想了2个,支持一下。。。。
;;;;;;;;第一种,排序;;;;;;;;
(defun insertnum1(lst num / lst lst1 lst2)
(setq lst(reverse(cdr(reverse(vl-sort-i (setq lst1(cons num lst))'>)))))
(mapcar '(lambda(x)(setq lst2(append lst2 (list(nth x lst1))))) lst)
lst2
)
;;;;;;;第二种,递归;;;;;;;;;;;;;;;;;;;;;;;;;
(defun insertnum2(lst num / )
(cond((>= num (car lst))
      (setq flag nil)
      (setq lst (cons num (reverse(cdr(reverse lst)))))
      )
     ((<= num (last lst))
      (setq flag nil)
      lst
      )
     (t
      (setq newlst (cons (car lst) newlst)
            lst    (cdr lst)
      )
      (if flag
      (insertnum lst num)
       )
      )
)
)
;;;;;;测试;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:tt1(/ newlst numlst number )
(setq numlst '(9 8 7 6 5 3) number 5)
(setq numlst(insertnum1 numlst number))
(princ numlst)
(princ)
)
(defun c:tt2(/ newlst numlst number flag)
(setq numlst '(9 8 7 6 5 3) number 5  flag t)
(setq numlst(insertnum2 numlst number)
       numlst(append (reverse newlst)numlst)
       )
(princ numlst)
(princ)
)

复制代码

复制代码


评分

参与人数 1明经币 +1 金钱 +30 收起 理由
highflybir + 1 + 30 赞一个!

查看全部评分

发表于 2012-6-22 22:18:29 | 显示全部楼层
多谢参与。代码很好!
发表于 2012-6-22 23:07:40 | 显示全部楼层
  1. ;;递归法
  2. (defun f (l n)
  3.   (if (> (car l) n)
  4.     (cons (car l) (f (cdr l) n))
  5.     (if l
  6.       (cons n (reverse (cdr (reverse l))))
  7.     )
  8.   )
  9. )

评分

参与人数 2明经币 +2 收起 理由
yjtdkj + 1 超级简洁啊
yjr111 + 1 得!真叫差距啊。。。

查看全部评分

发表于 2012-6-23 09:58:23 | 显示全部楼层
学习一下!!
 楼主| 发表于 2012-6-25 06:21:38 | 显示全部楼层
发表于 2012-6-25 08:12:50 | 显示全部楼层
看来算法题目也就这几种方法了,各位神仙都是法力无边啊,想起来玄幻小说中的“天地规则”“规则之力”,
发表于 2012-6-28 17:29:35 | 显示全部楼层
都是高人,俺还对递归还不是很理解!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-22 03:59 , Processed in 0.349652 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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