Enciclopedia de Conocimientos Fundamentales
UNAM ˜ SIGLO XXI


regreso








3.2.5 Recursividad

En el capítulo anterior se analizó la recursividad con detalle. Es interesante notar que en Scheme la recursividad es una forma natural de repetir tareas por el tipo de programación funcional que soporta. Al detallar la versión de factorial, utilizando recursividad y siguiendo la receta de diseño se obtiene:

;; Contrato: factorial: n[entero positivo] -> entero

;; Propósito: calcular el factorial del número de entrada.

;; Ejemplo: (factorial 5) debe producir 120

;; Definición:

(define (factorial n)

(if (<= n 1)

1

(* n (factorial (- n 1)))))

;; Pruebas:

(factorial 5)

(factorial 30)

El cuerpo del modelo de procedimiento es una condicional sencilla, de las que sólo tienen dos caminos, así que es posible utilizar la forma if. Se puede ver claramente que la siguiente parte se trata de una multiplicación de n por el factorial de n – 1. Al examinar las pruebas se observa que sí funciona:

> (factorial 5)

120

> (factorial 30)

265252859812191058636308480000000

Hay un procedimiento de Scheme que calcula el resultado de un número elevado a una potencia, exp., pero un reto interesante es programar un procedimiento propio, de modo que se anima al lector a crear un procedimiento llamado potencia.

Primero se analiza el problema: ¿cuál es el caso más sencillo de las exponenciales? Cuando el exponente es 0, porque cualquier base elevada a 0 es 1. Éste será el caso base.4 ¿Cómo luce en la receta de diseño, tomando en cuenta que se tiene que hacer una pregunta con dos posibles respuestas para saber si el exponente es cero o no?

;; Contrato: potencia: base[número] exp[entero] -> número

;; Propósito: calcular el valor de la función exponencial, tomando

;; como base el primer número y como exponente, el segundo.

;; Ejemplo: (potencia 2 3) debe producir 8

;; Definición:

(define (potencia base exp)

(if (= exp 0)

1

(* base (potencia base (- exp 1)))))

;; Pruebas:

(potencia 2 3)

(potencia 3 5)


Inicio de página