Rekursinya tidak berhenti. Coba baca ini:
http://www.delorie.com/gnu/docs/elisp-manual-21/elisp_141.html. Coba
kasih fungsi lengkapnya, fungsinya itu nggak berhenti.
misalnya ini nih :

(defun occurence(elemen l amount)
   (cond
       ((equal l nil) amount)
       ((equal elemen (car l)) (occurence elemen (cdr l) (+ amount 1)))
       (t (occurence elemen (cdr l) amount))
   )
)

(occurence 'a '(a b) 0)

(defun uh(ls ll ld)
   (cond
       ((equal ll nil) ls)
       ((equal (occurence (car ll) ld 0) 1) (
           cond ((equal ls nil)
               (uh (list(car ll)) (cdr ll) ld))
                ((atom ls)
               (uh (append (list ls) (list (car ll))) (cdr ll) ld))
                (t (uh (append ls (list (car ll))) (cdr ll) ld))
))
       (t (uh ls (cdr ll) ld))
   )
)


(defun unique-list (l)
   (cond
       ((equal l nil) nil)
       (t (uh nil l l))
   )
)

(unique-list '(a b c a))

ini code untuk menampilkan unique list, eksekusi list diatas ini harusnya jadi list (b c), eksekusi ini bisa jalan kalo listnya kecil, nah kalo listnya panjang dya overflow karena rekursi.

nah maunya ini dirubah pake loop ajah, jangan rekursi.

kira2 implementasinya pake fungsi dolist, dengan algoritma sebagai berikut:


- buat sebuah variable untuk menampung unique list, misalnya ul => (let ((ul nill)))
- untuk setiap anggota di dalam list (dolist x list) lakukan:
- hitung occurence dari x didalam list
- jika occurenc == 1, maka append x ke dalam ul (let ((x (append (ul x))))

nah fungsi (let ((x (append (ul x)))) sepertinya ga jalan kalo dilakukan berkali2 bikin error : Variable binding depth exceed max-specpdl-size

sebenernya gw pengen tau di lisp bisa ga sih melakukan expresi C ini :

x+=1;

atau

x = x + 1;

regards



--
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis

Kirim email ke