明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: lanjqka

[讨论] 学习 lisp 递归

[复制链接]
发表于 2014-1-13 13:27:54 | 显示全部楼层
个人觉得最好的要依赖于递归,它对于真正理解算法没帮助,相反的,把一些经典的算法从递归剥离出来可能对于算法的理解会更深入些,个人看法,希望别介意
 楼主| 发表于 2014-1-15 10:58:05 | 显示全部楼层
  1. ;|
  2. _$$ (czr '(0 1 2 3 4))
  3. 4
  4. |;
  5. (defun czr (lst)
  6.   (if (null (cadr lst))
  7.     (car lst)
  8.     (czr (cdr lst))
  9.   )
  10. )

  11. ;|
  12. _$$ (cztr '(0 1 2 3 4))
  13. 3
  14. |;
  15. (defun cztr (lst)
  16.   (if (null (caddr lst))
  17.     (car lst)
  18.     (cztr (cdr lst))
  19.   )
  20. )

  21. ;|
  22. _$$ (czttr '(0 1 2 3 4))
  23. 2
  24. |;
  25. (defun czttr (lst)
  26.   (if (null (cadddr lst))
  27.     (car lst)
  28.     (czttr (cdr lst))
  29.   )
  30. )

  31. ;|
  32. _$$ (ctr '(0 1 2 3 4))
  33. (0 1 2 3)
  34. |;
  35. (defun ctr (lst)
  36.   (if (null (cadr lst))
  37.     nil
  38.     (cons (car lst) (ctr (cdr lst)))
  39.   )
  40. )

  41. ;|
  42. _$$ (cttr '(0 1 2 3 4))
  43. (0 1 2)
  44. |;
  45. (defun cttr (lst)
  46.   (if (null (caddr lst))
  47.     nil
  48.     (cons (car lst) (cttr (cdr lst)))
  49.   )
  50. )

  51. ;|
  52. _$$ (ctttr '(0 1 2 3 4))
  53. (0 1)
  54. |;
  55. (defun ctttr (lst)
  56.   (if (null (cadddr lst))
  57.     nil
  58.     (cons (car lst) (ctttr (cdr lst)))
  59.   )
  60. )
 楼主| 发表于 2014-1-15 11:14:52 | 显示全部楼层
llsheng_73 发表于 2014-1-13 13:27
个人觉得最好的要依赖于递归,它对于真正理解算法没帮助,相反的,把一些经典的算法从递归剥离出来可能对于 ...

不介意
只是学习递归
不希望做争论
 楼主| 发表于 2014-1-16 15:04:21 | 显示全部楼层
本帖最后由 lanjqka 于 2014-1-16 15:27 编辑
  1. ;|
  2. _$$$$$$$$ (powerset '(1 2 3))
  3. ((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) nil)
  4. _$$$$$$$$ (powerset '(0 1 2 3))
  5. ((0 1 2 3) (0 1 2) (0 1 3) (0 1) (0 2 3) (0 2) (0 3) (0) (1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) nil)
  6. |;
  7. (defun powerset (lst)
  8.   (if (null lst)
  9.     (list nil)
  10.     (setpower (list (car lst)) (powerset (cdr lst)))
  11.   )
  12. )
  13. ;|
  14. _$$$$$$$$ (mapcar-append '(0) '((1 2) (1) (2)))
  15. ((0 1 2) (0 1) (0 2))
  16. _$$$$$$$$ (setpower '(0) '((1 2) (1) (2)))
  17. ((0 1 2) (0 1) (0 2) (1 2) (1) (2))
  18. |;
  19. (defun setpower (lsta lstb)
  20.   (defun mapcar-append (lsta lstb)
  21.     (if (null lsta)
  22.       nil
  23.       (if (null lstb)
  24.         nil
  25.         (cons (append lsta (car lstb)) (mapcar-append lsta (cdr lstb)))
  26.       )
  27.     )
  28.   )
  29.   (append (mapcar-append lsta lstb) lstb)
  30.   ;;(append (mapcar '(lambda (x) (append lsta x)) lstb) lstb)
  31. )
 楼主| 发表于 2014-1-16 16:21:32 | 显示全部楼层
  1. ;|
  2. _$$ (find-matching-pair '= '(1 2 3 4 5 6 7 1))
  3. (1 . 1)
  4. _$$ (find-matching-pair '< '(1 2 3 4 5 6 7 1))
  5. (1 . 2)
  6. _$$ (find-matching-pair '> '(1 2 3 4 5 6 7 1))
  7. nil
  8. |;
  9. (defun find-matching-pair (test lst)
  10.   (if (null (cadr lst))
  11.     nil
  12.     (if ((eval test) (car lst) (cadr lst))
  13.       (cons (car lst) (cadr lst))
  14.       (find-matching-pair test (cons (car lst) (cddr lst)))
  15.     )
  16.   )
  17. )
发表于 2014-1-17 11:37:14 | 显示全部楼层
这个用递归怎么写...拜托高手指导下
  1. (defun tst (l n / k nn)
  2.   (setq k -1 nn (length l))
  3.   (mapcar
  4.     (function
  5.       (lambda (a / ll m)
  6.        (setq k (1+ k) m k)
  7.        (repeat n
  8.        (setq ll (append ll (list (nth m l))))
  9.        (setq m (rem (1+ m) nn))
  10.        ll
  11.        )
  12.        )
  13.       )
  14.     l
  15.     )
  16.   )
 楼主| 发表于 2014-1-20 10:34:51 | 显示全部楼层
q3_2006 发表于 2014-1-17 11:37
这个用递归怎么写...拜托高手指导下
  1. ;|
  2. _$$ (ntha 2 '(0 1 2 3 4))
  3. (0 1)
  4. |;
  5. (defun ntha (n lst)
  6.   (if (null lst)
  7.     nil
  8.     (if (zerop n)
  9.       nil
  10.       (cons (car lst) (ntha (- n 1) (cdr lst)))
  11.     )
  12.   )
  13. )

  14. ;|
  15. _$$ (tst '(0 1 2 3 4) 2)
  16. ((0 1) (1 2) (2 3) (3 4))
  17. |;
  18. (defun tst (lst n)
  19.   (if (null lst)
  20.     nil
  21.     (if (< (length lst) n)
  22.       nil
  23.       (cons (ntha n lst) (tst (cdr lst) n))
  24.     )
  25.   )
  26. )
 楼主| 发表于 2014-1-20 10:36:11 | 显示全部楼层

  1. ;|
  2. _$$ (-sublst '(0 1 2 3 4 5 6) 2 3)
  3. (2 3 4)
  4. |;
  5. (defun -sublst (lst i n) ;(if (catchapply (sublst lst ist iend)
  6.   (if (null lst)
  7.     nil
  8.     (if (zerop i)
  9.       (if (zerop n)
  10.         nil
  11.         (cons (car lst) (-sublst (cdr lst) i (- n 1)))
  12.       )
  13.       (-sublst (cdr lst) (- i 1) n)
  14.     )
  15.   )
  16. )


  17. ;|
  18. _$$ (nthrm 2 '(0 1 2 3 4))
  19. (0 1 3 4)
  20. _$$ (nthrm 0 '("a"))
  21. nil
  22. |;
  23. (defun nthrm (n lst)
  24.   (if (null lst)
  25.     nil
  26.     (if (zerop n)
  27.       (cdr lst)
  28.       (cons (car lst) (nthrm (- n 1) (cdr lst)))
  29.     )
  30.   )
  31. )

  32. ;|
  33. _$$ (ntha 2 '(0 1 2 3 4))
  34. (0 1)
  35. |;
  36. (defun ntha (n lst)
  37.   (if (null lst)
  38.     nil
  39.     (if (zerop n)
  40.       nil
  41.       (cons (car lst) (ntha (- n 1) (cdr lst)))
  42.     )
  43.   )
  44. )

  45. ;|
  46. _$$ (nthb 2 '(0 1 2 3 4))
  47. (3 4)
  48. |;
  49. (defun nthb (n lst)
  50.   (if (null lst)
  51.     nil
  52.     (if (zerop n)
  53.       (cdr lst)
  54.       (nthb (- n 1) (cdr lst))
  55.     )
  56.   )
  57. )

  58. ;|
  59. _$$ (nthac 2 '(0 1 2 3 4))
  60. (0 1 2)
  61. |;
  62. (defun nthac (n lst)
  63.   (if (null lst)
  64.     nil
  65.     (if (zerop n)
  66.       (cons (car lst) nil)
  67.       (cons (car lst) (nthac (- n 1) (cdr lst)))
  68.     )
  69.   )
  70. )

  71. ;|
  72. _$$ (nthbc 2 '(0 1 2 3 4))
  73. (2 3 4)
  74. |;
  75. (defun nthbc (n lst)
  76.   (if (null lst)
  77.     nil
  78.     (if (zerop n)
  79.       lst
  80.       (nthbc (- n 1) (cdr lst))
  81.     )
  82.   )
  83. )
发表于 2014-1-20 12:36:43 | 显示全部楼层
lanjqka 发表于 2014-1-20 10:36

谢谢,学习了!
 楼主| 发表于 2014-1-20 13:35:36 | 显示全部楼层
  1. ;|
  2. _$$ (-sub-cons-s '(0 1 2 3 4 5 6) 2)
  3. ((0 1) (2 3) (4 5))
  4. |;
  5. (defun -sub-cons-s (lst n)
  6.   (if (null lst)
  7.     nil
  8.     (if (< (length lst) n)
  9.       nil
  10.       (cons (ntha n lst) (-sub-cons-s (nthbc n lst) n)))))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 21:41 , Processed in 0.168549 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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