cg-Cad

Lisp »Tips 'n Tricks »Funzioni ricorsive in AutoLISP »1 | 2 | 3 | 4 | 5 | 6 | 7

NP

Np è la traduzione in Autolisp di un programma in Pascal che dichiara se un numero è primo (divisibile solo per se stesso e per l'unità).

;;;
;;;    np.lsp  - 9 Febbraio 2004
;;;    (C) by Claudio Piccini
;;;    http://www.cg-cad.com/
;;;
;;;    Traduzione in Autolisp di
;;;    numpr.pas by Ali Qamar 
;;;    Description: Finds a prime number.
;;;    The program is made recursively 
;;;

(defun primo (a)
 (cond 
  ((= a 1)
   (princ "\nIl numero e' primo")
   (princ)
  )
  ((= (rem num a) 0) ; num mod a=0
   (princ "\nIl numero non e' primo")
   (princ)
  )
  ((/= a 1)
   (primo (- a 1)) 
  )
 )
)

(defun c:np (/ num y)
 (initget (+ 1 2 4))
 (setq num (getint "\nInserisci un numero: "))
 (setq y (/ num 2))
 (if (= num 1)
  (progn
   (princ "\nIl numero e' primo")
   (princ)
  )
  (princ (primo y))
 )
)
;;;eof

{
Name: Ali Qamar 
Email: yaarali@hotmail.com
Language: Pascal 
Category: Miscellaneous 
Description: Finds a prime number.
The program is made recursively 
}

program Numpr; 

var
  num, y : integer; 

procedure prime (a : integer); 
begin
  if a=1 then 
    writeln('The number is prime ') 
  else if 
    num mod a=0 then 
      writeln('The number is not prime') 
  else if a<>1 then 
    prime(a-1); 
end; 

begin 
  write('Enter a number : '); 
  readln(num); 
  y := num div 2; 
  if num=1 then 
    writeln('The number is prime') 
  else 
    prime(y); 
  readln; 
end. 
numpr.zip

Test del LISP
Provo np.lsp con i numeri: 1, 2, 3, 4, 5, 6, 7

Command: np
Inserisci un numero: 1
Il numero e' primo
Command: np
Inserisci un numero: 2
Il numero e' primo
Command: np
Inserisci un numero: 3
Il numero e' primo
Command: np
Inserisci un numero: 4
Il numero non e' primo
Command: np
Inserisci un numero: 5
Il numero e' primo
Command: np
Inserisci un numero: 6
Il numero non e' primo
Command: np
Inserisci un numero: 7
Il numero e' primo

FRT1

Frt1 è un Lisp che disegna un quadrato di dimensione 2r centrato nel punto p1(x,y). La funzione ricorsiva permette di generare un frattale.
L'algoritmo di base è il seguente:

star(int x, int y, int r)
{
   if (r > 0)
   {
      star(x-r,y+r,r/2);
      star(x+r,y+r,r/2);
      star(x-r,y-r,r/2);
      star(x+r,y-r,r/2);
      box(x,y,r);
   }
}

Da: "Algoritmi in C++", R. Sedgewick Ed. Addison-Wesley

;;;
;;;    frt1.lsp  - 9 Febbraio 2004
;;;    (C) by Claudio Piccini
;;;    http://www.cg-cad.com/
;;;
;;;    Disegna un frattale
;;;

(defun myerror (s)                 
 (if (/= s "Function cancelled")
  (princ (strcat "\nError: " s))
 )
 (ripVar)
 (princ)
)

(defun salVar ()
 (setq orto (getvar "orthomode"))                         
 (setq snapp (getvar "osmode"))
 (setq snm (getvar "snapmode"))
 (setq piano (getvar "clayer")) 
)

(defun ripVar ()
 (command "_redraw")
 (setvar "cmdecho" 1)
 (setvar "osmode" snapp)
 (setvar "snapmode" snm)
 (setvar "orthomode" orto)
 (setvar "clayer" piano)
 (setq *error* olderr)
 (princ)
)

(defun star (x y r)
 (if (> r 0)
  (progn
   (star (- x r)(+ y r)(/ r 2))
   (star (+ x r)(+ y r)(/ r 2))
   (star (- x r)(- y r)(/ r 2))
   (star (+ x r)(- y r)(/ r 2))
   (setq p1 (list x y 0))
   (command "_polygon" 4 p1 "" r)
  )
 )
)

(defun c:frt1 (/ p1 x y r)
 (setq olderr  *error*  *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (command "osnap" "_non")
 (setq p1 (getpoint "\nClicca un punto:"))
 (initget (+ 2 4))
 (setq r (getint "\nRaggio del quadrato (10): "))
 (if (= r nil)
  (setq r 10)
 )
 (setq x (car p1))
 (setq y (cadr p1))
 (star x y r)
 (ripVar)
)
;;;eof

Test del LISP
Raggio = 10.

frt1.lsp

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 9 Febbraio 2004