Re: [問題] 1-9位數不重複印出來 (Lisp)

看板Programming作者 (i,j,k) ×(x,y,z)時間7年前 (2017/05/25 01:27), 7年前編輯推噓1(102)
留言3則, 2人參與, 最新討論串1/1
最近在玩 lisp ,都只在 emacs 裡執行而已。 這個問題想超久,自己也不知道卡在哪, 總之還是寫出來了。 有 prolog 竟然沒有 lisp ! 好歹也算傳奇又常見的語言。 不過這個板 prolog 文章好像比 lisp 多。 ;; 因為需要巢狀呼叫,所以變成 nest list, ;; 可以看成 tree 的結構。 ;; 對一棵樹所有元素執行 func, ;; 返回由返回值組成的樹的副本。 (defun map-tree (func tree) (if (atom tree) (if (null tree) nil (funcall func tree)) (cons (map-tree func (car tree)) (map-tree func (cdr tree))))) ;; 把數字 i 從 tree 中移除。(換成 nil。) (defun filter-out-number (i tree) (map-tree (lambda (j) (if (= i j) nil j)) tree)) ;; 把一棵樹除了 i 以外的值濾掉, ;; 再把每個元素乘十倍加上 i。 (defun multi-ten (i tree) (map-tree (lambda (j) (+ i (* j 10))) tree)) ;; 遞迴本體 ;; 若 n = 1 則返回 (defun n-ten-list (n lst) (if (= n 1) lst (map-tree (lambda (i) (multi-ten i (n-ten-list (- n 1) (filter-out-number i lst)))) lst))) ;; 包裝函數 (defun n-ten (n) (n-ten-list n '(0 1 2 3 4 5 6 7 8 9))) 結果大概像這樣: ((nil (nil nil 210 310 410 510 610 710 810 910) (nil 120 nil 320 420 520 620 72\ 0 820 920) (nil 130 230 nil 430 530 630 730 830 930) (nil 140 240 340 nil 540 6\ 40 740 840 940) (nil 150 250 350 450 nil 650 750 850 950) (nil 160 260 360 460 \ ... 還是長得像事後濾掉的。 還是 lisp 新手, 不知道怎麼 print 或處理列表, 就變成很醜的巢狀列表。 還有一些邏輯應該可以再優化, 等認識多一點函數後再來改進吧。 -- cruelgentle: 有不少建中北一女情侶一起考上逢甲 閃爆了 08/11 00:48 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.102.187 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1495646869.A.50C.html ※ 編輯: hijkxyzuw (140.116.102.187), 05/25/2017 01:32:48

05/25 09:04, , 1F
print 可以用format 或 write
05/25 09:04, 1F

05/25 13:05, , 2F
emacs lisp 沒有 format …
05/25 13:05, 2F

05/25 13:06, , 3F
幹有欸!
05/25 13:06, 3F
文章代碼(AID): #1P9SALKC (Programming)
文章代碼(AID): #1P9SALKC (Programming)