Uploaded by SKQZ 64

Ejercicios de Recursividad (2)

advertisement
INSTITUTO TECNOLOGICO DE OAXACA
Ejercicios de recursividad
Estructura de datos
Integrantes del equipo
Jiménez Jijón Edgar David
José Gutiérrez Karen Lizeth
Rodríguez Cervantes Daniel
Martínez Lara Kevin
9 de noviembre de 2021
Ejercicio 1 – Factorial
Given n of 1 or more, return the factorial of n, which is n * (n-1) * (n-2) ... 1.
Compute the result recursively (without loops).
Solucion.
Hacemos la funcion fac, donde se pedira como los siguientes requisistos:
•
N: que es el número queremos sacar su factorial
•
N2: que será un auxiliar para poder multiplicar.
•
Resu: que se rea donde será igual a n al inicio e ira cambiando su valor
por cada multiplicación
La se pedirá que n cumpla una condición que es que n sea mayor 1, esto
porque dentro del if se hace la resta de n- 1 y el resultado se guarda en n2 e igual
dentro del if se hace la multiplicación de resu*n2 y por ultimo se manda a llamar
otra vez la función pasando los valores de la siguiente manera :
•
N: será el valor de n2
•
N2 : será 0
•
Resu: seguirá siendo resu.
Y por último cuando no se cumpla la condición se pasara al esle para imprimir
el resultado.
Ahora hacemos el método main para ejecutar el programa, en este método
pedimos el valor que queremos calcular la factorial y por ultimo mandamos a
llamar a la función fac.
Elaborado por: Edgar David Jiménez Jijón.
Pruebas de ejecución.
Elaborado por: Edgar David Jiménez Jijón.
Ejercicio 2
Given a non-negative int n, return the count of the occurrences
of 7 as a digit, so for example 717 yields 2. (no loops). Note
that mod (%) by 10 yields the rightmost digit (126 % 10 is 6), while
divide (/) by 10 removes the rightmost digit (126 / 10 is 12).
La primera sentencia if es el caso base en el que querríamos
terminar. El segundo comprueba si el dígito más a la derecha es
7. Si es así, corte el dígito más a la derecha y vuelva a
intentarlo. Cuando las llamadas recursivas terminan y los valores
comienzan a ser devueltos en la cadena, hay que agregar 1
parala compilación. En el caso de que ninguna de las
afirmaciones anteriores sea cierta, corte el dígito más a la
derecha y vuelva a intentarlo.
Esta solución funciona al revés, desde el enésimo dígito hasta el
primer dígito, tomando el módulo de la entrada. agregamos el
número de sietes encontrado en la devolución, para la salida
final.
Luego, verificar si la entrada es menor que 7 puede ser el siguiente
paso. Si la entrada es menor que 7, para empezar, nunca ha
habido 7 en la entrada.
public int count7(int n) {
int sevens_found = 0;
if( n % 10 == 7 ) sevens_found ++;
return ( n < 7) ? 0 : ( n % 10 == 7 ) ?
sevens_found + count7 ( n / 10 ) : count7 ( n / 10 );
}
Ejercicio 3 – Orejas de Conejo
We have bunnies standing in a line, numbered 1, 2, ... The odd bunnies (1, 3, ..) have the normal 2
ears. The even bunnies (2, 4, ..) we'll say have 3 ears, because they each have a raised foot.
Recursively return the number of "ears" in the bunny line 1, 2, ... n (without loops or
multiplication).
Ejemplo:
bunnyEars2(0) → 0
bunnyEars2(1) → 2
bunnyEars2(2) → 5
El código generado es el siguiente:
Para el entendimiento del código debemos solo basarnos en que los conejos nombrados con un
número impar (1, 3, 5, 7, etc.) son aquellos que tendrán 2 orejas y los demás números pares (2, 4,
6, 8, etc.) tendrán 3 orejas. Solamente debemos ir analizando cada número desde el ingresado
(conejos) ir bajando de 1 en 1 hasta llegar a 0, donde tenemos la condicional de que, si ‘conejos’ es
0, el método retornará el valor de 0, en cambio, si el valor actual a analizar de conejo es un
número par, es decir, si al dividirlo entre 2 su residuo es 0, el conejo a evaluar tendrá 3 orejas,
retornando el método el valor de 3, sumándole además, el valor que se retornará al evaluar la
cantidad de conejos menos 1, es decir, ahora un valor impar, para el cual, existe la segunda
condicional, de que si no se cumple la división exacta entre 2, el conejo en cuestión tendrá
asignado un valor impar, por lo cual, ahora el método retornará el valor de 2, sumándole también
el valor que retorne el mismo método evaluando ahora el número de conejos mismo menos 1,
tomando un valor par, siguiendo así la recursividad hasta llegar a 0, terminado todo el proceso, se
sumarán todos los números para que se imprima en la pantalla.
Si ponemos 40 conejos en el programa, 20 de esos conejos serán de 2 orejas, dando 40 orejas, y 20
de los otros conejos tendrán 3 orejas, siendo 60 orejas, 40 + 60 = 100.
EJECUCIÓN DEL PROGRAMA
Ejercicio 4 – Contar x’s
Given a string, compute recursively (no loops) the number of lowercase 'x' chars in the string.
Ejemplo:
countX("xxhixx") → 4
countX("xhixhix") → 3
countX("hi") → 0
El Código generado es el siguiente
Primero hay que destacar que, si no ingresamos nada, automáticamente el programa regresará el
valor de 0. 0 veces x contadas.
Para entender el código solamente hay que partir de una palabra, por ejemplo “Axiomax”
En el segundo if o segunda condicional se evaluará el primero carácter de la cadena ingresada, en
este caso, “A”, no equivale a x, así que tomará la segunda vía de la condicional, la cual es retornar
ahora el valor que tome el mismo método, pero evaluando a partir del siguiente carácter del
String con la instrucción “cadena.substring(1)”, ahora el método tomará la cadena “xiomax” y
evaluará el primer carácter, en este caso “x”, por lo cual al ser el mismo valor de la primera
condicional if (exceptuando la de la cadena vacía) entonces el método retornará el valor de 1, más
el valor que retorne el mismo método ahora con una cadena que empiece con el 3er carácter,
“iomax”, y así hasta dejar vacía la cadena, donde retornará el valor de 0. Para al final sumar 2 y ese
es el valor que tomará todo el método.
EJECUCIÓN
EJERCICIO 5: Contar 11’s en un array
Problema: Given an array of ints, compute recursively the number of times that the
value 11 appears in the array. We'll use the convention of considering only the part
of the array that begins at the given index. In this way, a recursive call can pass
index+1 to move down the array. The initial call will pass in index as 0.
Solución:
En el problema nos pide contar la cantidad de 11 que se encuentran en un arreglo,
para ello hacemos una función recursiva a la que llamamos contar implementándola
de la siguiente forma:
En la función recursiva contar:
•
Int [ ] array11: declaración de un arreglo de tipo int.
•
Int i; índice o contador de la posición del arreglo.
•
Primero se implementa un caso base el caso base que es cuando llegamos
al final del arreglo, retornando valor 0 pues se sabe que no hay más números
11.
•
En un segundo caso utilizamos el índice i desde la posición actual del arreglo
la cual la inicializamos en 0, y con una condición en caso de que el número
del arreglo en la posición i sea igual a 11, se cuentan los números 11 y se
almacena en el contador i + 1. Después de eso se puede verificar de forma
recursiva el resto del arreglo hasta que se recorra por completo o cumpla las
condiciones dadas.
Clase de prueba:
Implementamos una clase de prueba en un método main:
Como resultado obtuvimos:
Download