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: