Clase 5: Recursión
Problema 1. Escribir una función que calcule el factorial de un entero positivo. Por ejemplo, 4!=24=1*2*3*4 y 0!=1 Solución 1: x! = 1*2*...*x
(0!=1)
static public int factorial(int x) { int producto=1, i=1; while( i <= x ) { producto = producto * i; i = i + 1; } return producto; }
Método (Función) recursivo • se invoca a sí mismo ej: factorial(x-1) • debe tener una salida no recursiva (caso base) ej: if( x == 0 ) return 1; • las llamadas a sí mismo deben acercarse (converger) al caso base (deben disminuir el tamaño del problema) ej: factorial(x-1)
Problema. Función que cuente dígitos de un entero positivo. Ej: dígitos(245) entrega 3, dígitos(4) entrega 1. solución iterativa static public int digitos(int x) { int n = 1; while( x >= 10 ) { n = n + 1; x = x/10;//elimina último dígito } return n; } x n
25-03 (B. Bustos)
245 1
24 2
2 3
Solución 2: x! = x * (x-1)!
(0!=1)
static public int factorial(int x) { if( x == 0 ) return 1; else return x * factorial(x-1); } Notas • más simple • 4 líneas • sin iteración (while) • sólo uso de parámetro • sin variables adicionales
Operación f(4)=4*f(3)→ f(3)=3*f(2)→ f(2)=2*f(1)→ f(1)=1*f(0)→ f(0)=1→ f(1)=1*1=1→ f(2)=2*1=2→ f(3)=3*2=6→ f(4)=4*6=24
solución recursiva: • 1 si x<10 • 1 + digitos(x/10) si x >= 10 static public int digitos(int x) { if( x < 10 ) return 1; else return 1 + digitos(x/10); } digitos(245)=1+digitos(24) digitos(24)=1+digitos(2) digitos(2)=1 digitos(24)=1+1=2 digitos(245)=1+2=3
1