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

08.29
Wed
さっきの続きです

でうでもいいコードを垂れ流して申し訳ないです

再びLisp初心者によるLisp勉強のためのくだらないコードです

さっきの記事にマージソートが抜けてたので...

あとためし割りによる素因数分解のなんか


(defun sublst (lst start end &optional (result nil))
    (if (= (length result) (+ 1 (- end start)))
        result
        (progn
            (setq result (rcons result (getfactor lst (+ (length result) start))))
            (sublst lst start  end result)
        )
    )
)

(defun splitlst (lst)(list (sublst lst 0 (- (floor (/ (length lst) 2)) 1)) (sublst lst (floor(/(length lst)2))  (- (length lst) 1))))

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

(defun rfactorcons (lst1 lst2)
    (if (null lst1)
        lst2
        (rfactorcons (cdr lst1) (cons (car lst1) lst2))
    )
)

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


(defun merge-lst (lst1 lst2 &optional (result nil))
    (cond
        ((and (null lst1) (null lst2)) result)
        ((null lst1) (reverse(rfactorcons lst2 result)))
        ((null lst2) (reverse(rfactorcons lst1 result)))
        (t
            (let ((lst1-head (car lst1)) (lst2-head (car lst2)))
                (cond
                    ((= (min lst1-head lst2-head) lst1-head)
                        (progn
                            (setq result (cons lst1-head result))
                            (merge-lst (cdr lst1) lst2 result)
                        )
                    )
                    ((= (min lst1-head lst2-head) lst2-head)
                        (progn
                            (setq result (cons lst2-head result))
                            (merge-lst lst1 (cdr lst2) result)
                        )
                    )
                )
            )
        )
    )
)

(defun mrgsort (lst)
    (if (= (length lst)1)
        lst
        (progn
            (let ((harf (splitlst lst)))
                (merge-lst (mrgsort (car harf)) (mrgsort (cadr harf)))
            )
        )
    )
)


(defun isprime (n proc)
	(if (or (= n 2) (= n proc))
		t
		(progn
			(if (= (mod n proc ) 0)
				nil
				(isprime n (+ proc 1))
			)
		)
	)
)

(defun primelst (n lst)
	(if (= n 2) 
		(cons 2 lst)
		(progn
			(if (isprime n 2)
				(primelst (- n 1) (cons n lst))
				(primelst (- n 1) lst)
			)
		)
	)

)


(defun factorization (n lst result)
	(if (isprime n 2) 
		(list n)
		(progn
			(if (= n (confirm result));(if (and (null lst) (not (null result)))
				result
				(progn
					(if (and (null lst) (null result))
						(setq lst (primelst (floor (sqrt n)) nil))
					)
					(if (= (mod n (car lst)) 0)
						(progn
							(setq result (cons (car lst) result))
							(setq result (append result (factorization (/ n (car lst)) nil nil)))
						)
					)
					(factorization n (cdr lst) result)
				)
			)
		)
	)

)

(defun confirm (lst)
	(if (null lst)
		1
		(* (car lst) (confirm (cdr lst)))
	)
)


(print (mrgsort '(2 3 4 5 1 3 7 4 9 1 0 2 5 8 9 4 9 3 5 2 1 9)))
(print (factorization 12341 nil nil))


以上です.


ちょっとした追記ですが,

私、昔から再帰プログラムを書くのがとても苦手だったんですけど、

関数型言語いじるようになってから、

以前よりは書けるようになった気が微妙にしますね(気のせいかな)
スポンサーサイト
comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/131-5423ad16
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。