|
Lisp »Tips 'n Tricks
»Funzioni ricorsive in AutoLISP
»1
| 2
| 3
| 4
| 5
| 6
| 7 a
, b
, c
, d
, e
>II
>III
>IV
>V
>VI
>VII
Ricerca binaria in una lista ordinata e non
RBR usa le funzioni ricorsive per cercare un elemento in una lista ordinata.
Data una lista ordinata si legge l'elemento centrale se corrisponde alla chiave la ricerca è finita altrimenti si cerca nella prima metà della lista o nella seconda metà in base al fatto che la chiave sia minore o maggiore dell'elemento centrale.
;|
Rbr.lsp - 16 Marzo 2004
© 2004 Claudio Piccini
www.cg-cad.com
Ricerca binaria in una lista ordinata
Traduzione in Autolisp di ricercaBinRic()
Dal testo: C e Java, Laboratorio di Programmazione
Mc Graw Hill, 1997
©1997 A. Cisternino G. Fiorentino M.R. Laganà F. Romani F. Turini
#include "ricbric.h"
#include "bool.h"
bool ricercaBinRic(Elem x, Vettore a, int i, int j)
{
if (i > j)
return False;
else {
int k = (i + j)/2;
if (x == a[k])
return True;
if (x < a[k])
return ricercaBinRic(x, a, i, k - 1);
else
return ricercaBinRic(x, a, k + 1, j);
}
}
|;
(defun cerca (x ls i j / k)
(if (= test 0)
(progn
(if (> i j)
(progn
(setq test 1)
(princ "Falso")
)
(progn
(setq k (/ (+ i j) 2))
(if (= x (nth k ls))
(progn
(setq test 1)
(princ "Vero")
)
)
(if (and (< x (nth k ls))(= test 0))
(cerca x ls i (- k 1))
(cerca x ls (+ k 1) j)
)
)
)
)
)
)
(defun c:rbr ( / test ls j i x)
(setq test 0)
(setq ls
(list "Albero"
"Bianco"
"Cielo"
"E"
"Nuvola"
"Ombra"
"Spring"
)
)
(setq j (length ls))
(setq i 0)
(setq x (getstring "\n? "))
(cerca x ls i j)
(princ)
)
;;;eof
|
Test del LISP
Command: RBR
? Albero
Vero
Command: RBR
? E
Vero
Command: RBR
? albero
Falso
Command: RBR
? Bianco
Vero
Command: RBR
? Nuvola
Vero
Command: RBR
? Spring
Vero
Command: RBR
? Cielo
Vero
Command: RBR
? 123.5
Falso
Command: RBR
? Ombra
Vero
E se la lista non è ordinata? RBR2 implementa l'algoritmo delle bolle (Bubblesort).
Il metodo delle bolle consiste nello scorrere la lista, effettuando scambi quando due elementi contigui non sono nell'ordine giusto. In questo modo gli elementi minori, più leggeri salgono verso l'alto (immaginando la lista in verticale) come bolle... Il lisp usa la funzione (scambia x y).
Per vedere se funziona il lisp mostra la lista prima e dopo la bollitura.
;|
Rbr2.lsp - 16 Marzo 2004
© 2004 Claudio Piccini
www.cg-cad.com
Ricerca binaria in una lista non ordinata
|;
(defun scambia (i j / temp a b q lss)
(setq temp (nth i ls))
(if (/= i j)
(progn
(setq a (nth j ls))
(setq q 0)
(repeat (length ls)
(setq b (nth q ls))
(cond
((= q i)
(setq lss (append lss (list a)))
)
((= q j)
(setq lss (append lss (list temp)))
)
((and (/= q i)(/= q j))
(setq lss (append lss (list b)))
)
)
(setq q (1+ q))
)
(setq ls lss)
(setq lss nil)
)
)
)
(defun cerca (x i j / k)
(if (= test 0)
(progn
(if (> i j)
(progn
(setq test 1)
(princ "Falso")
)
(progn
(setq k (/ (+ i j) 2))
(if (= x (nth k ls))
(progn
(setq test 1)
(princ "Vero")
)
)
(if (and (< x (nth k ls))(= test 0))
(cerca x i (- k 1))
(cerca x (+ k 1) j)
)
)
)
)
)
)
(defun BubbleSort (size / i s)
(setq i 1)
(while (< i size)
(setq s (- size 1))
(while (>= s i)
(if (>
(nth (- s 1) ls)
(nth s ls)
)
(scambia (- s 1) s)
)
(setq s (1- s))
)
(setq i (1+ i))
)
)
(defun c:rbr ( / test ls j i x)
(setq test 0)
(setq ls
(list "E"
"Cielo"
"Bianco"
"Nuvola"
"Spring"
"Albero"
"Ombra"
)
)
(setq j (length ls))
(setq i 0)
(princ ls) ;mostra la lista ls
(BubbleSort j) ;ordina la lista ls
(princ "\n")
(princ ls) ;mostra la lista ordinata
(setq x (getstring "\n? "))
(cerca x i j)
(princ)
)
;;;eof
|
Test del LISP
Command: rbr
(E Cielo Bianco Nuvola Spring Albero Ombra)
(Albero Bianco Cielo E Nuvola Ombra Spring)
? Albero
Vero
Command:
Command:
RBR (E Cielo Bianco Nuvola Spring Albero Ombra)
(Albero Bianco Cielo E Nuvola Ombra Spring)
? E
Vero
Command:
Command:
RBR (E Cielo Bianco Nuvola Spring Albero Ombra)
(Albero Bianco Cielo E Nuvola Ombra Spring)
? ombra
Falso
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 16 Marzo 2004
|
|