Problemas de Recursividad



Documentos relacionados
Estructura de datos y de la información Boletín de problemas - Tema 9

MATEMÁTICAS 2º ESO. TEMA 1

Tema 4: Múltiplos y Divisores

Tema 2 Divisibilidad

Los números naturales

Tema 2. Divisibilidad. Múltiplos y submúltiplos.

Estudio del tiempo de ejecución de algoritmos recursivos a través de relaciones de recurrencia lineal

APUNTES DE MATEMÁTICAS

Ejercicios 3A. 2. Implemente un programa que, dados los tres vértices de un triángulo, calcule el área del mismo. Puede aplicar la siguiente fórmula:

MÚLTIPLOS Y DIVISORES

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. Dept. de Computación, Universidade da Coruña

UNIDAD 1: NÚMEROS NATURALES

Ámbito Científico y Tecnológico. Repaso de números enteros y racionales

CURSOSO. Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. MATEMÁTICAS. AntonioF.CostaGonzález

MATEMÁTICAS BÁSICAS UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN CLASE # 5

POTENCIAS. MÚLTIPLOS Y DIVISORES. MÁXIMO COMÚN DIVISOR Y MÍNIMO COMÚN MÚLTIPLO.

Ejercicios de Excel. 2. Repetir el ejercicio anterior, pero suponiendo que los ingresos y los gastos están dados por trimestres.

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7

SESIÓN 8 EXPONENTESY RADICALES

CEIP Mediterráneo. 1º relación de divisibilidad: múltiplos y divisores.

operaciones inversas Para unificar ambas operaciones, se define la potencia de exponente fraccionario:

Ejercicio 1: Realiza las siguientes divisiones por el método tradicional y por Ruffini: a)

Diseñar un algoritmo que lea 3 números e imprima el mayor y el menor valor de los tres. La

GUÍA NÚMERO 1. Saint Gaspar College MISIONEROS DE LA PRECIOSA SANGRE Formando Personas Íntegras Departamento de Matemática RESUMEN PSU MATEMATICA

3. Métodos clásicos de optimización lineal

VALOR ABSOLUTO. Definición.- El valor absoluto de un número real, x, se define como:

Números enteros. Dado cualquier número natural, éste siempre será menor que su sucesor, luego los naturales son ordenados.

LA DIVISIBILIDAD. Luego, 24 es divisible entre 3. CÓMO SABER SI UN NÚMERO ES DIVISIBLE ENTRE OTRO, SIN HACER LA DIVISIÓN?

Práctica 2 Métodos de búsqueda para funciones de una variable

Fracciones. 1. Concepto de fracción 1.a. Las fracciones en nuestra vida Lee el texto de pantalla. 1.b. Definición y elementos de una fracción

Curso de Matemática. Unidad 2. Operaciones Elementales II: Potenciación. Profesora: Sofía Fuhrman. Definición

DIVISIBILIDAD. 1º relación de divisibilidad: múltiplos y divisores.

Utiliza los números ordinales al resolver problemas planteados de manera oral.

MÚLTIPLOS Y DIVISORES DIVISIBILIDAD M.C.D. y M.C.M. Un número es múltiplo de otro si se obtiene multiplicando este último por un número natural.

Números primos y compuestos

Polinomios. 1.- Funciones cuadráticas

IV NÚMEROS FRACCIONARIOS.

Los números enteros. > significa "mayor que". Ejemplo: 58 > 12 < significa "menor que". Ejemplo: 3 < 12 Cualquier número positivo siempre es mayor

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

Anexo C. Introducción a las series de potencias. Series de potencias

Unidad 1 Números. Los números naturales son aquellos que se utilizan para contar los elementos de un conjunto.

Definición(2) La base (r) de un sistema de numeración especifica el número de dígitos o cardinal* de dicho conjunto ordenado. Las bases más utilizadas

Recordar las principales operaciones con expresiones algebraicas.

APLICACIÓN DE ÁRBOLES BINARIOS

TEORIA DE NUMEROS (I) REGLAS DE DIVISIBILIDAD

MATEMÁTICAS 5º PRIMARIA DIVISIBILIDAD: MÚLTIPLOS Y DIVISORES

1) Indique los primeros elementos de los siguientes conjuntos numéricos: Números Naturales: IN = { Números Cardinales: IN o = { 0,1,2,3,4,5,6,7,...

en coma flotante Oliverio J. Santana Jaria Sistemas Digitales Ingeniería Técnica en Informática de Sistemas Curso

TEMA 1: NÚMEROS NATURALES, DIVISIBILIDAD 1º ESO. MATEMÁTICAS

Distribución normal. Cajón de Ciencias. Qué es una variable estadística?

Tema 7: Polimorfismo. Índice

Notas del cursos. Basadas en los prontuarios de MATE 3001 y MATE 3023

Introducción Programación Modular y a Métodos: Consideremos el siguiente ejercicio:

TEMA 6. LAS FRACCIONES. Fraccionar es dividir en partes iguales. Se puede fraccionar en las partes que se quiera siempre que sean iguales.

LECCIÓN 9 5 PROBLEMAS RESUELTOS

Cuaderno de Actividades 4º ESO

Unidad 1: Números reales.

Existen distintas formas de representar una función lógica, entre las que podemos destacar las siguientes:

Tema 9. Recursividad

Problemas de 4 o ESO. Isaac Musat Hervás

Práctica 5.- Recursividad

Expresión, Operador, Operando, Asignación, Prioridad

Complejidad de algoritmos recursivos

Práctica 3. CÁLCULO DE LA FUNCIÓN SENO UTILIZANDO UN DESARROLLO EN SERIE

Ámbito Científico-Tecnológico Módulo III Bloque 3 Unidad 2 Cuanto más, mejor y viceversa

Capítulo 3: El anillo de los números enteros

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

TEMA 2: POLINOMIOS IDENTIDADES NOTABLES. Ejercicios: 1. Desarrolla las siguientes identidades: 2. Expresa como producto de factores:

UNIDAD UNO PROGRAMACIÓN LÍNEAL Parte 3

Arreglos Unidimensionales En este tipo de arreglo se hace uso de un índice solamente para hacer referencia a una posición particular del arreglo.

2. SISTEMAS DE ECUACIONES LINEALES. Introducción

Lógica y compuertas (Parte 2): Circuitos Combinacionales y Secuenciales

lasmatemáticas.eu Pedro Castro Ortega materiales de matemáticas

Estructura de datos y de la información Boletín de problemas - Tema 2

Álgebra Lineal Ma1010

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Lección 8: Potencias con exponentes enteros

1 Números racionales

SOLUCIONES A LAS ACTIVIDADES DE CADA EPÍGRAFE

Una sucesión infinita es una función cuyo dominio es el conjunto de los enteros positivos. Podemos denotar una sucesión como una lista

Vectores y Matrices. Tema 3: Repaso de Álgebra Lineal Parte I. Contenidos

U.E. Colegio Los Arcos Matemáticas Guía #26B Sexto grado Máximo común divisor. Problemas.

UNIDAD 1. NÚMEROS NATURALES Y OPERACIONES

Grado en Química Bloque 1 Funciones de una variable

Función lineal y afín

Unidad 3: Operaciones y propiedades de los números naturales

Universidad Politécnica de Puerto Rico Departamento de Ciencias y Matemáticas. Preparado por: Prof. Manuel Capella-Casellas, M.A.Ed.

DIVISIBILIDAD NÚMEROS NATURALES

Complejidad de Algoritmos

EJEMPLO DE CÓDIGO JAVA BÁSICO. CREAR CLASES CON CAMPOS, CONSTRUCTOR Y MÉTODOS. LA PALABRA CLAVE THIS (CU00652B)

CONCEPTO O DEFINICIÓN DE HERENCIA EN JAVA Y EN PROGRAMACIÓN ORIENTADA A OBJETOS. QUÉ ES? EXTENDS. EJEMPLOS. (CU00684B)

RESUMEN DE SUCESIONES. Definición: Una sucesión es un conjunto ordenado de números reales:

Desde la secundaria estamos acostumbrados a trabajar con polinomios, los cuales identificamos con expresiones de la forma

EJERCICIOS RESUELTOS DEL TEMA 5

Todo numero es divisible por 2 si y solo si termina en cero o en una cifra par

Programación I. Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA)

PROGRAMACIÓN LINEAL. 1. Introducción

Tablas Hash y árboles binarios

Transcripción:

Problemas de Recursividad Problema 1. El factorial de un número entero n 0, denotado como n!, se define! como!!! i = 1 2 n cuando n > 0, y 0! = 1. Por ejemplo 6! = 1 2 3 4 5 6 = 720 Diseñad una método recursiva que lo calcule e implementadlo en Java (junto con un programa que lo utilice) Problema 2. Para calcular el máximo común divisor de dos números enteros puedo aplicar el algoritmo de Euclides, que consiste en ir restando el más pequeño del más grande hasta que queden dos números iguales, que serán el máximo común divisor de los dos números. Por ejemplo, si comenzamos con el par de números 412 y 184, tendríamos: 412 228 44 44 44 44 44 36 28 20 12 8 4 184 184 184 140 96 52 8 8 8 8 8 4 4 Es decir, m.c.d.(412, 184) = 4 Problema 3. Diseñad un método recursivo tal que, dado un vector de números enteros, retorne la suma de sus elementos. Para poder hacer recursividad, usaremos un índice que indique el trozo de vector a sumar en cada llamada. Es decir, el método a diseñar tendrá la forma: 1 public int sum(int[] elems, int pos) { Diseñad este método así como el que lo utiliza para calcular la suma de todo el vector. Tened en cuenta cómo hacemos para referirnos a un intervalo dentro de un vector. Qué pasa si el vector está vacío (es decir, cuando elems.length vale cero)? Usando el método recursivo, implementad el método que lo usa para calcular la suma de todo el vector, es decir: 1

4 public int sum(int[] elems) { 5 return sum(elems,?); 6 } Nota: Podéis considerar dos descomposiciones del vector, una en la que la zona que vais sumando crece de derecha a izquierda y otra en la que lo hace en sentido contrario. Problema 4. Diseñad un método recursivo que escriba al revés la cadena que se le pasa como parámetro, más un índice que se usará para indicar la cadena. Dicho método será de la forma: 1 public void printreversed(string text, int index) { Haced dos versiones del mismo: una en la que la subcadena sobre la que trabaja la función sea el prefijo de la cadena original otra en la que sea el sufijo. En ambos casos implementad la función que llama a la función recursiva diseñada, es decir: 4 public void printreversed(string text) { 5 printreversed(text,?); 6 } Mostrad las secuencias de llamadas que se producen para la cadena abcd en ambos casos. Nota: No se considera una solución válida invertir la cadena y luego escribirla. Problema 5. El ejemplo de la exponenciación mostrado en los apuntes, permite la siguiente descomposición: Si b es par, a! = a! (! div 2) = a! div 2! Si b es impar, a! = a! (! div 2)+1 = a a! div 2! Acabad de diseñar la solución recursiva que la emplea, implementar la solución en Java y hacer el mismo diagrama de llamadas para el caso de 7!". 2

Nota: Es muy interesante que intentéis resolver un mismo problema de varias maneras y comparéis entre sí las diferentes soluciones. Problema 6. Ya que estamos, diseñad un método tal que dada una cadena, retorne la cadena invertida (es decir, el primer carácter del resultado será el último de la cadena dada, etc.). Dicho método tendrá la forma: 1 public String invert(string text) { Para hacerlo, debéis diseñar otro tal que dado un vector de caracteres, lo invierta. Como los parámetros que son vectores se pasan por referencia, el método invert sobre vectores puede ser de la forma: 1 public void invert(char[] textchars) { Para encontrar recursividad deberéis hacer otro método que, además del char[], use uno o más índices sobre el vector. Problema 7. Diseñad un método tal que, dados dos vectores de enteros, retorne un booleano indicando si son iguales, es decir, si tienen los mismos valores en las mismas posiciones. Para poder hacerlo recursivamente deberéis, como ya es habitual, hacer otro método que incluya índices para indicar los trozos de subvectores sobre los que se trabaja. Indicad qué llamada se hace al método recursivo para resolver el problema inicial. Problema 8. Diseñad un método tal que calcule el máximo de un vector no vacío de números enteros. De forma similar al problema 4, implementad el método que llama al que habéis definido recursivamente para que se calcule el máximo de todo el vector. Problema 9. El algoritmo chino de multiplicación. Diseñad un método que multiplique dos números enteros usando las siguientes equivalencias: 3

x y = 2 x y 2 = 2 x (y div 2), si y es par 2 x y div 2 + x, si y es impar Una cuestión a considerar es la siguiente: la expresión (2*x) puede calcularse de manera no recursiva. Una posibilidad es usar: 2 * x = x + x 2 * x también puede implementarse (y en realidad el código que genera el compilador es lo que hace) desplazando un bit la representación binaria de x. En el tema de Archivos veremos cómo usar los desplazamientos de bits en Java. Problema 10. Dado un vector de números enteros ordenado decrecientemente, diseñad un método tal que compruebe si el valor de alguno de los elementos del vector coincide con su índice. Podéis hacer dos versiones: una que vaya comprobando elemento a elemento si dicha propiedad se cumple (para esta versión, el método recursivo usará, además del vector, un índice). otra que, usando dos índices, sea capaz de descartar a cada llamada la mitad del vector. En ambos casos implementad los métodos que hacen la llamada inicial al que habéis diseñado recursivamente dando valores iniciales a los índices. Pista: podéis pensar qué relación tiene este problema con la búsqueda dicotómica y, si la encontráis, obtendréis la solución. Problema 11. Un problema parecido al anterior se puede plantear cuando el vector de enteros está ordenado crecientemente y no contiene valores repetidos. El razonamiento en este caso es más complicado que en el caso anterior (obviamente cuando se intenta hacer la versión que, a cada paso divide la longitud del intervalo donde buscar por la mitad). Pista: la idea de la solución consiste en darse cuenta de que los valores crecen como mínimo tanto como los índices. Esto es cierto porque el vector no contiene elementos repetidos. Problema 12. La sucesión de Fibonacci viene definida por la siguiente recurrencia: f!!! = f! + f!!! con valores iniciales f! = 0 y f! = 1. 4

Diseñad e implementad un método recursivo para calcular el enésimo término de la sucesión y mostrad el árbol de llamadas que se produce al calcular f! con vuestra solución. Problema 13. Mostrad cómo se va modificando el vector int[] v = {7, 8, 1, 3, 5, 4, 1, 6} cuando se ordena utilizando el algoritmo de QuickSort explicado en los apuntes. Mostrad por separado las llamadas que se realizan a la función partition. 5