--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

08.28
Tue
最近関数型言語勉強中のmoratoriです。

ラムダ抽象とかクロージャとか高階関数とかちゃんと理解してガシガシ書けるようになりたいところです...

この記事はLispでソートそいうことで

まぁかなりどうでもいいですが、書いとこうと思います


(defun getlast (lst)(car(reverse lst)))

(defun getfactor (lst index)
    (if (or (> index (- (length lst) 1)) (> 0 index)) 
        lst
        (progn
            (if (= index 0)
                (car lst)
                (getfactor (cdr lst) (- index 1))
            )
        )
    )
)

;search index val > factor
(defun searchindex (lst val &optional (fname '>) &key (index 0))
    (if (null lst)
        -1
        (progn
            (if (funcall fname val (car lst))
                index
                (searchindex (cdr lst) val fname :index(+ index 1))
            )
        )
    )
)

(defun getmostindex (lst &optional (index 0))
	(if (= (searchindex lst (getfactor lst index)) -1)
		index
		(progn
			(getmostindex lst (searchindex lst (getfactor lst index))) 
		)
	)

)

(defun rcons (lst val)(reverse (cons val (reverse lst))))

;i1 < i2
(defun change (lst i1 i2 &optional (result ()) &key (index 0))
    (if (= index (length lst))
        result
        (progn
            (if (/= index i1)
                (progn
                    (if (/= index i2)
                        (setq result (rcons result (getfactor lst index)))
                        (setq result (rcons result (getfactor lst i1)))
                    )
                )
                (setq result (rcons result (getfactor lst i2)))
            )
            (change lst i1 i2 result :index (+ index 1))
        )
    )
)

(defun notlist (lst index &optional (counter 0) &key (result ()))
	(if (= (length result) (- (length lst) 1))
		result
		(progn
			(if (/= counter index)
				(setq result (rcons result (getfactor lst counter)))
			)
			(notlist lst index (+ counter 1) :result result)
		)
	)
)


(defun changenext (lst index &optional (fname '>))
    (if (funcall fname (getfactor lst index) (getfactor lst (+ index 1)))
        (change lst index (+ index 1))
        lst
    )
)

(defun adjoinsort (lst endindex &optional (index 0) )
    (if (= endindex index)
        lst
        (adjoinsort (changenext lst index) endindex (+ index 1)) 
    )
)

(defun slcsort (lst &optional (result ()))
	(if (null lst)
		result
		(progn
			(setq result (rcons result (getfactor lst (getmostindex lst))))
			(slcsort (notlist lst (getmostindex lst)) result)
		)
	)
)

(defun bblsort (lst &optional (index 0))
    (if (= (- (- (length lst) 1) index) 0)
        lst
        (bblsort (adjoinsort lst (- (- (length lst) 1) index)) (+ index 1))
    )
)



(let ((lst '(1 3 6 7 3 2 5 8 9 4 2 4 8)))
    (print (bblsort lst))
    (print (slcsort lst))
)
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/130-9711bd92
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。