# Programación imperativa en Maxima

## Maxima como calculadora

2 * 5 + 6 - (100 + 3);

8/2; 8/3;

float(8/3);

## Variables y asignaciones

a : 8$

b : 2*a;

a+b;

a : a+1$

a;

[a,b] : [2,5]$

a+2*b;

## Bloques de instrucciones

(a:2, b:5, c:3, d : a+2*b-c);

b;

x:3$

block([x,y], x:2, y:5, z:x+y);

x;

y;

z;

## Definición de funciones

Ejercicio 1. Definir la función suma tal que suma(x,y) es la suma de x e y. Por ejemplo,

(%i1) suma(2,3);
(%o1) 5

suma(x,y) := x+y$

suma(2,3);

## Escritura y lectura

Ejercicio 2. Definir el procedimiento suma que lea dos números y escriba su suma. Por ejemplo,

(%i1) suma()$
Escribe el primer número 
2$
Escribe el segundo número 
3$
La suma es 5 

suma() := block([a,b],
  a : read("Escribe el primer número"),
  b : read("Escribe el segundo número"),
  print("La suma es:",a+b))$

suma()$

## La estructura condicional

### Condicionales simples

Ejercicio 3. Definir, usando condicionales, la función maximo tal que 
maximo(x,y) es el máximo de x e y. Por ejemplo,

(%i1) maximo(2,5);
(%o1) 5
(%i2) maximo(2,1);
(%o2) 2

maximo(x,y) := 
  if x > y
     then x
     else y$

maximo(2,5);

maximo(2,1);

### Condicionales múltiples

Ejercicio 4. Definir la función signo tal que signo(x) es el signo de x. Por ejemplo,

(%i1) signo(5);
(%o1) 1
(%i2) signo(-7);
(%o2) - 1
(%i3) signo(0);
(%o3) 0

signo(x) := if     x > 0 then  1
            elseif x < 0 then -1
            else               0$

signo(5);

signo(-7);

signo(0);

## Estructuras iterativas

### Bucles mientras

Ejercicio 5. Definir, con un bucle while, la función sumaImpares tal que 
sumaImpares(n) es la suma de los n primeros números impares. Por ejemplo,

(%i1) sumaImpares(3)
(%o1) 9
(%i2) sumaImpares(4)
(%o2) 16

sumaImpares(n) := block([s:0, k:0],
  while k < n do
    (s : s + 2*k + 1,
     k : k + 1),
  s)$

sumaImpares(3);

sumaImpares(4);

### Bucle hasta

Ejercicio 6. Definir la función mayorExponente tal que mayorExponente(a,n) es el mayor k tal que a^k divide a n. Por ejemplo,

(%i1) mayorExponente(2,40);
(%o1) 3

mayorExponente(a,n) := block([k:0],
  unless (mod(n,a) # 0) do
    ( n : n/a,
      k : k+1),
  k)$

mayorExponente(2,40);

### Bucle para

Ejercicio 7. Definir, por iteración con for, la función fact tal que fact(n) es 
el factorial de n. Por ejemplo,

(%i1) fact(4);
(%o1) 24

fact(n) := block([f:1, k],
  for k from 1 thru n do f : f*k,
  f)$

fact(4);

### Bucle para sobre listas

Ejercicio 8. Definir, por iteración, la función suma tal que suma(xs) 
es a suma de los números de la lista xs. Por ejemplo,

(%i1) suma([3,2,5]);
(%o1) 10

suma(xs) := block([r:0,x],
  for x in xs do (r:x+r),
  r)$

suma([3,2,5]);

## Recursión

Ejercicio 9. Definir, por recursión, la función fact tal que factR(n) es el 
factorial de n. Por ejemplo,

(%i1) fact(4);
(%o1) 24

fact(n) :=
  if n = 0 then 1
  else     n*fact(n-1)$

fact(4);

## Función de Takeuchi

Definición de la función de Takeuchi

tak(x,y,z) :=
  if is(x <= y) then y
  else tak(tak(x-1,y,z),
           tak(y-1,z,x),
           tak(z-1,x,y))$

Activación de la medición del tiempo:

showtime:true$

Primer experimento:

tak(12,6,1);

Compilación de la función tak:

compile(tak);

Segundo experimento:

tak(12,6,1);

tak(13,6,1);

tak(14,6,1);