Variable estática java. Métodos estáticos en Java, sobrecarga de métodos, recursividad. que es estático

Complejomesas mesatipo
« objetos - varios objetos» ( Naciones Unidas)

Tipo de tabla " objetos-objetos-múltiples

Vista general de tablas tipo ONU:

En esta tabla la cabeza ( título superior) tiene una estructura de tres niveles.

Ejemplo 5

Tabla 2.9

Calificaciones de Ciencias de la Computación y estudiantes de matematicas 7mo grado


En este ejemplo, los pares se forman a partir de objetos que pertenecen a las clases "estudiante" y "sujeto". Las propiedades aquí son las calificaciones recibidas por los estudiantes durante diferentes períodos de estudio.

Intentemos presentar la misma información de manera diferente. Formamos pares de objetos pertenecientes a las clases “estudiante” y “período de estudio”. Consideraremos como propiedades las calificaciones recibidas por los estudiantes en las materias.

Tabla 2.10

Calificaciones de Ciencias de la Computación y estudiantes de matematicas 7mo grado


De este ejemplo queda claro que los objetos y las propiedades pueden cambiar de rol: lo que era un objeto se convierte en una propiedad, y viceversa. Se debe elegir una u otra opción dependiendo del propósito de compilar la tabla. Por ejemplo, para monitorear el progreso de un estudiante durante diferentes períodos de tiempo en la misma materia, es más conveniente utilizar la Tabla 2.9. Y el panorama general del rendimiento académico durante todo el período de estudio es más fácil de entender utilizando la Tabla 2.10. La Tabla 2.11 muestra un extracto del resumen de desempeño de los estudiantes disponible al final del registro de clase.

Tabla 2.11

Calificaciones de Ciencias de la Computación y estudiantes de matematicas 7mo grado

Tabla del tipo “objetos - propiedades - objetos” (OSO)

Ejemplo 6

en la mesa 2.12 Se presentan datos antropométricos de estudiantes de 7mo grado. Esta tabla es del tipo OOS.

Tabla 2.12Antropométrico datos de alumnos de 7mo grado

Los resultados mostrados por los niños en la competición deportiva escolar se muestran en la Tabla 2.13. Esta tabla es tipo ONU.

Tabla 2.13 Resultados deportivos escolares

Combinemos la información contenida en la tabla 2.12 y la tabla 2.13. Para hacer esto, "aumentaremos" el lado de la Tabla 2.12 insertando después de él las columnas necesarias de la Tabla 2.13. Obtenemos:

Tabla 2.14

Antropométrico datos y deportes resultados de los estudiantes 7mo grado


En esta tabla, las propiedades "altura" y "peso" no están emparejadas; se relacionan únicamente con objetos de la clase "estudiante". Las propiedades "resultado" y "puntuaciones" caracterizan pares de objetos de las clases "estudiante" y "ejercicio".

A diferencia de las tablas de otros tipos, las tablas del tipo OCO no se pueden "voltear de lado", ya que las propiedades individuales de los objetos deben estar necesariamente de lado.

Preguntas Y asignaciones

1. ¿Qué ventajas ofrecen los modelos de información tabular sobre las descripciones verbales? Da un ejemplo.

2. ¿Se puede sustituir cualquier descripción verbal por una tabular? modelo de información? Da un ejemplo.

3. Da ejemplos de modelos de información tabular que hayas encontrado en la escuela.

4. Dé ejemplos de modelos de información tabular que haya encontrado en la vida cotidiana.

5. ¿Qué reglas se deben seguir al compilar tablas?

v. ¿Qué tipos de información se colocan en las columnas de la tabla? ¿Es posible colocar imágenes gráficas allí? Da un ejemplo.

Corto oh lo principal

Para describir una serie de objetos que tienen el mismo conjunto de propiedades, se utilizan con mayor frecuencia tablas que constan de columnas y filas. La información presentada en la tabla es clara, compacta y fácil de ver.

Una tabla de propiedades de objetos es una tabla que contiene información sobre las propiedades de objetos individuales que pertenecen a la misma clase.

Tipo de tabla " objetos-objetos-uno" es una tabla que contiene información sobre alguna propiedad única de pares de objetos, que generalmente pertenecen a diferentes clases.

Tipo de tabla " objetos-objetos-múltiples" es una tabla que contiene información sobre varias propiedades de pares de objetos que pertenecen a diferentes clases.

Una tabla del tipo “objetos-propiedades-objetos” es una tabla que contiene información sobre las propiedades de pares de objetos que pertenecen a diferentes clases y sobre propiedades individuales de objetos de una de las clases.

Una tabla de propiedades de objetos es una tabla que contiene información sobre las propiedades de objetos individuales que pertenecen a la misma clase.

Vista general de las tablas de tipos de SO:

El número de filas de la tabla depende del número de objetos presentes y el número de columnas depende del número de propiedades que se consideran.

Ejemplo 1

Esta tabla proporciona información sobre algunas ciudades rusas antiguas que conservan monumentos únicos de nuestra cultura e historia y forman el mundialmente famoso Anillo de Oro de Rusia. Esta información se refleja en el encabezado de la tabla.

La tabla muestra los objetos "Vladimir", "Kostroma", "Pereslavl-Zalessky" y "Gus-Khrustalny", pertenecientes a la clase "ciudad". Para cada objeto se dan los valores de las propiedades “año de fundación”, “fundador” y “hito”, expresados ​​en números y palabras.

En tablas pequeñas (3-4 filas), los objetos se pueden enumerar en cualquier orden. Si hay muchos objetos en la tabla, entonces es necesario organizarlos en algún orden significativo, de acuerdo con alguna regla. Por ejemplo, en la tabla anterior, las ciudades pueden aparecer en orden alfabético, en orden ascendente o descendente del año de su fundación.

Si una tabla del tipo OS tiene más propiedades que objetos, entonces se puede "voltear de lado": las filas se pueden convertir en gráficos y los gráficos en filas.

Por ejemplo:

Qué se debe colocar exactamente en la cabeza y qué se debe colocar en el costado (objetos o propiedades) depende de la tabla específica. Como regla general, una tabla con muchas filas y pocas columnas es más conveniente que una tabla con pocas filas pero muchas columnas.

Tipo de tabla Objetos-Objetos-Uno (OOO).
Una tabla objetos-objetos-uno es una tabla que contiene información sobre alguna propiedad única de pares de objetos, que a menudo pertenecen a clases diferentes.

Vista general de tablas de tipos LLC:

En esta tabla, el encabezado (título superior) tiene una estructura compleja (de dos niveles).

Ejemplo 2

Una tabla tipo LLC se puede “voltear de lado”; las filas se pueden convertir en columnas y las columnas en filas.

Por ejemplo:

Una tabla de tipo OOO registra una propiedad de un par de objetos, por lo que sus celdas siempre contienen valores del mismo tipo: números, palabras o imágenes gráficas.

Ejemplo 3
La tabla “Distancias entre ciudades” presenta las distancias entre pares de objetos que pertenecen a la misma clase “ciudad”, por lo tanto los objetos de esta clase se enumeran tanto en el encabezado como en el lateral de la tabla. Como resultado, el encabezado de la mesa "pierde" un nivel y la mesa en sí parece más simple. Esta tabla también se aplica al tipo LLC.

Tablas similares están en atlas. autopistas. Es cierto que están formateados así:

Ejemplo 4

Con esta tabla puede hacerse una idea de lo que les interesa a los estudiantes de séptimo grado, a qué clubes y secciones asisten. Si el estudiante está interesado en el baile, los deportes o gráficos por computadora(asiste al círculo o sección correspondiente), entonces se coloca 1 en la celda requerida, y si no, 0.

Las celdas de esta tabla contienen números, pero sólo 0 y 1. Estas tablas se denominan tablas binarias.

Una característica importante de esta tabla es que no registra datos cuantitativos (¿cuántos?), sino propiedades de calidad(presencia/ausencia de conexión entre
objetos).

Brevemente sobre lo principal:

  • Una tabla de propiedades de objetos es una tabla que contiene información sobre las propiedades de objetos individuales que pertenecen a la misma clase.
  • Una tabla objetos-objetos-uno es una tabla que contiene información sobre alguna propiedad única de pares de objetos, que generalmente pertenecen a clases diferentes.

Preguntas y tareas:

Última actualización: 19/04/2018

Excepto métodos convencionales y campos, una clase puede tener campos estáticos, métodos, constantes e inicializadores. Por ejemplo, la clase principal del programa tiene un método principal, que es estático:

Principal público estático vacío (argumentos de cadena) ()

Para declarar variables estáticas, constantes, métodos e inicializadores, indicar antes de su declaración palabra clave estático.

Campos estáticos

Cuando se crean objetos de clase, cada objeto tiene su propia copia de campos regulares no estáticos. Y los campos estáticos son comunes a toda la clase. Por lo tanto, se pueden utilizar sin crear objetos de clase.

Por ejemplo, creemos una variable estática:

Programa de clase pública (public static void main (String args) ( Persona tom = nueva Persona(); Persona bob = nueva Persona(); tom.displayId(); // Id = 1 bob.displayId(); // Id = 2 System.out.println(Person.counter); // 3 // cambiar Persona.counter Person.counter = 8; Persona sam = nueva Persona(); // Id = 8 ) clase Persona (privado int id; estático int); contador=1; Persona())( id = contador++; ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

La clase Persona contiene un contador de variable estática, que se incrementa en el constructor y su valor se asigna a la variable id. Es decir, al crear cada nuevo objeto Persona, esta variable aumentará, por lo que cada nuevo objeto Persona tendrá un valor de campo id que es 1 mayor que el anterior.

Dado que la variable del contador es estática, podemos referirnos a ella en el programa por el nombre de clase:

System.out.println(Persona.contador); // obtenemos el valor Person.counter = 8; // cambiar el valor

Salida de consola del programa:

Identificación = 1 Identificación = 2 3 Identificación = 8

Constantes estáticas

También estáticas son las constantes que son comunes a toda la clase.

Programa de clase pública (public static void main (String args) (doble radio = 60; System.out.printf("Radisu: %f \n", radio); // 60 System.out.printf("Área: %f \n", Math.PI * radio); // 188.4 ) ) clase Math( público final estático doble PI = 3,14; )

Vale la pena señalar que en todos los temas anteriores, las constantes estáticas ya se han utilizado activamente. En particular, en la expresión:

System.out.println("hola");

out solo representa una constante estática de la clase System. Por tanto, se accede a él sin crear un objeto de la clase Sistema.

Inicializadores estáticos

Los inicializadores estáticos están diseñados para inicializar variables estáticas o para realizar acciones que se realizan cuando se crea el primer objeto. Por ejemplo, definamos un inicializador estático:

Programa de clase pública (public static void main (String args) ( Persona tom = nueva Persona(); Persona bob = nueva Persona(); tom.displayId(); // Id = 105 bob.displayId(); // Id = 106 ) ) clase Persona( id int privado; contador int estático; estático( contador = 105; System.out.println("Inicializador estático"); ) Persona())( id=contador++; System.out.println("Constructor " ); ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

Un inicializador estático se define como un inicializador normal, solo que está precedido por la palabra clave static. EN en este caso en el inicializador estático configuramos el valor inicial del contador de campo estático e imprimimos un mensaje en la consola.

En el propio programa se crean dos objetos de la clase Persona. Por lo tanto, la salida de la consola se verá así:

Inicializador estático Constructor Id. del constructor: 105 Id.: 106

Vale la pena considerar que el inicializador estático se llama solo antes de que se cree el objeto de primera clase.

Métodos estáticos

Métodos estáticos También se aplican a toda la clase en su conjunto. Por ejemplo, en el ejemplo anterior, el contador de la variable estática era accesible externamente y podíamos cambiar su valor fuera de la clase Persona. Hagamos que no esté disponible para cambios desde el exterior, pero sí accesible para lectura. Para ello utilizamos un método estático:

Programa de clase pública (public static void main (String args) (Persona.displayCounter(); // Contador: 1 Persona tom = nueva Persona(); Persona bob = nueva Persona(); Persona.displayCounter(); // Contador: 3 ) ) clase Persona( id int privado; contador int estático privado = 1; Persona())( id = contador++; ) // método estático public static void displayCounter())( System.out.printf("Contador: %d \n ", contador); ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

Ahora la variable estática no es accesible desde el exterior, es privada. Y su valor se muestra utilizando el método displayCounter estático. Para llamar a un método estático, use el nombre de clase: Person.displayCounter().

Al usar métodos estáticos, debemos tener en cuenta las limitaciones: en los métodos estáticos, solo podemos llamar a otros métodos estáticos y usar solo variables estáticas.

En general, los métodos se definen como estáticos cuando los métodos no afectarán el estado del objeto, es decir, sus campos y constantes no estáticos, y no tiene sentido crear una instancia de la clase para llamar al método. Por ejemplo:

Programa de clase pública( public static void main(String args) ( System.out.println(Operation.sum(45, 23)); // 68 System.out.println(Operation.subtract(45, 23)); // 22 System.out.println(Operation.multiply(4, 23)); // 92 ) clase Operación( static int sum(int x, int y)( return x + y; ) static int rest(int x, int y )( retorno x - y; ) static int multiplicar(int x, int y)( retorno x * y; ) )

En este caso, para los métodos suma, resta y multiplicación, no importa qué instancia de la clase Operación se utilice. Estos métodos funcionan sólo con parámetros, sin afectar el estado de la clase. Por tanto, pueden definirse como estáticos.

Un método estático es un fragmento de programa al que se le asigna algún nombre único, y que se puede llamar con este nombre desde otras partes del programa. En el momento en que se produce la llamada se realizan las acciones enumeradas dentro del método (en su descripción o cuerpo).
En la programación orientada a objetos, la tarea principal de los métodos es cambiar el estado actual de un objeto, pero mientras los objetos aún no se utilicen en el programa, los métodos ya se pueden introducir. Un método que se describe dentro de una clase pero se llama sin una aplicación. objeto específico esta clase se llama estática.

Además del nombre y la descripción mencionados anteriormente, el método tiene otras características:

  1. Un conjunto de modificadores.
  2. Tipo de valor de retorno.
  3. Un conjunto de argumentos (parámetros).

Modificadores de método

Para crear un método estático, debe especificar antes de su nombre. modificador estático. Si no se hace esto, entonces el método solo se podrá llamar en una aplicación a un objeto específico de esta clase (no será estático).

El modificador público es responsable del nivel de acceso al método descrito. Se pueden especificar niveles en lugar de públicos. acceso privado o proteger, o no se puede especificar nada, se aplicará el nivel de acceso predeterminado.

Nos familiarizaremos con los niveles de acceso con más detalle cuando creemos nuestras propias clases, pero por ahora tengamos en cuenta que el acceso predeterminado permite el acceso a un método desde cualquier parte del paquete en el que se describe el método. Y el nivel público permite acceder al método desde cualquier lugar. Incluyendo de otros paquetes y programas.

El método principal debe tener nivel de acceso público precisamente porque se accede a él mediante un método virtual. máquina java, no forma parte de ningún paquete.

Además, existen otros modificadores que, por ejemplo, le permiten regular el funcionamiento de los métodos durante cálculos paralelos (multiproceso).

Tipo de devolución

Los métodos en Java se pueden dividir en dos grupos: funciones y procedimientos. El primer grupo incluye métodos que son muy similares a funciones en el sentido matemático. Como resultado de su trabajo, dichos métodos devuelven algún resultado específico al lugar del programa desde donde fueron llamados. tipo existente, es decir, puede ser un número entero o numero real o valor lógico (int, double, boolean), matriz (referencia a él), objeto (referencia a él). El valor de retorno debe asignarse a una variable. tipo adecuado o pasado a algún otro método como argumento.

A diferencia de las funciones, los métodos de tipo procedimental producen algún tipo de acciones útiles, pero no dan un resultado completo que pueda expresarse en un valor u objeto específico.

Doble r = Math.random(); /* aleatorio se refiere a funciones */ System.out.println(r); /* println se refiere a procedimientos */

Si creáramos un método que, como println, imprimiera texto en la pantalla, pero al mismo tiempo contara el número de espacios en el texto y devolviera este resultado, obtendríamos una función. En este caso, la función continuaría realizando acciones útiles características del procedimiento println. En consecuencia, una función es más universal que un procedimiento, pero no siempre es necesaria.

Al crear un método, el primer paso es determinar si será una función o un procedimiento. Para cálculos intermedios se suelen utilizar funciones. Los procedimientos también pueden ser adecuados para acortar fragmentos de código similares.

Después de los modificadores, pero también a la izquierda del nombre del método, se indica el tipo de valor que devuelve (si el método es una función, por ejemplo: int o double) o la palabra void (si el método es un procedimiento).

Si un método es una función, entonces debe contener comando de retorno luego de lo cual, separada por un espacio, se indica la expresión cuyo valor se debe devolver como resultado del método.

Todos los comandos especificados en la descripción del método después del retorno ya no se ejecutarán; el retorno sin un argumento se puede utilizar dentro de los procedimientos. Simplemente finalizará el procedimiento antes de lo previsto (análogo a interrumpir un bucle).

Argumentos (parámetros)

Al llamar a un método, se le puede pasar un conjunto de ciertos valores desde el programa principal. Para enseñar a un método a aceptarlos (y procesarlos dentro del método), los pares del formulario deben enumerarse entre paréntesis después del nombre del método: tipo_argumento nombre_argumento separados por comas.

Luego, al llamar a un método, será posible especificar un conjunto de valores correspondientes a los tipos descritos por los argumentos.

Los valores que se pasan al método en el momento de la llamada se denominan parámetros reales y los nombres de los argumentos que aparecen en la descripción del método se denominan parámetros formales.

Cada parámetro formal es una variable local dentro del método, es decir, no está disponible fuera del método (fuera de su bloque de descripción). Cuando se llama al método, el valor real se copia en el parámetro formal.

En particular, esto significa que al pasar cualquier variable tipo básico como parámetro de un método cuando se llama, no podremos cambiar el valor de esta variable en el programa principal. Si cualquier objeto o matriz se pasa a un método a través de un argumento, entonces solo se copia dentro del método una referencia al objeto o matriz (es decir, su dirección en la memoria). Las acciones que realizamos en una matriz u objeto dentro de un método afectarán el estado de esta matriz u objeto en el programa principal incluso después de que el método complete su trabajo. Dentro del método accedimos a la misma dirección y trabajamos con los mismos datos en memoria que estaban disponibles en el programa principal.

Si el nombre del parámetro real es el mismo que parámetro formal, entonces esto no supone ningún problema: dentro del método hay una variable local, en la que se copia el valor de la variable global del mismo nombre cuando se llama. Al acceder a este nombre dentro del método, terminaremos con una variable local y no podremos acceder a la global.

Descripción del método

El método debe describirse dentro de la clase, pero un método no se describe dentro del otro, es decir, el método debe estar anidado directamente en el bloque de clase.

Esquema general para describir el método:

Modificadores tipo_valor_retorno nombre_método (argumentos formales) ( // acciones realizadas por el método // posiblemente, retorno )

Tradicionalmente, el nombre del método debe comenzar con una letra minúscula. Si consta de varias palabras, cada palabra subsiguiente comienza con mayúscula. El nombre del método se elige de forma que quede claro lo que hace.

Veamos algunos ejemplos:

Público estático doble kvadk (doble) ( doble t; t = Math.pow(a, 0.5); return t; )

Ahora dentro del método principal podemos usar nuestro método. Por ejemplo, así:

Int a = 25; System.out.println(kvadk(a)); // 5.0 System.out.println(a) // 25

Cuando se pasan parámetros reales a un método, se produce la conversión automática. Si el argumento real no coincide con el tipo formal, entonces Java intenta convertir el argumento real a un tipo más tipo universal(en este caso, int se convirtió en doble).

Sobrecarga de métodos

La firma de un método es la combinación de su nombre y un conjunto de parámetros formales.
Java le permite crear múltiples métodos con los mismos nombres pero con diferentes firmas. Crear un método con el mismo nombre pero con un conjunto diferente de parámetros se llama sobrecarga. Java determina qué método sobrecargado debe ejecutarse cuando se llama en función de los parámetros reales.

void pr(doble a) ( System.out.println(a); ) void pr (String a) ( System.out.println(a); ) void pr(int a) ( for (int i=0; i

Un ejemplo de uso del método.

Int a = 5; int m = (1, 2, 8, 3) String s = "Mundo"; pr (a) //el método original funciona pr (a+s); // Mundo 5, la primera sobrecarga se está ejecutando pr (m); // 1 2 8 3 pr (m+a); // error

La variable a no es de tipo double, pero se procesa mediante el método original, ya que es posible la conversión automática de int a double. Es imposible en la dirección opuesta. Si el método tuviera un argumento de tipo int, entonces no podría generar números reales.

La sobrecarga de métodos implementa una propiedad tan importante en la programación como el polimorfismo. Polimórfico es un código de software asociado con un nombre común, pero que tiene diferentes implementaciones. La implementación que funcionará se elige en función del contexto en el que se mencionó el nombre. Específicamente para los métodos, sus sobrecargas son polimórficas y la selección de la sobrecarga ejecutable se produce de acuerdo con los parámetros.

Polimorfismo: un nombre, muchas formas.

Ejemplos de uso de métodos.

El siguiente programa busca y muestra todos los divisores primos no triviales de un número ingresado por el usuario desde el teclado, comenzando con el divisor más grande, o informa que el número ingresado es primo.

Importar java.util.Scanner; clase pública Principal ( público estático booleano isPrime(int n) ( for(int i = 2; i<= Math.sqrt(n) ; i++) { if(n%i == 0) { return false; } } return true; } public static void main(String args) { Scanner sc = new Scanner(System.in); System.out.print("Введите натуральное число: "); if(sc.hasNextInt()) { int u = sc.nextInt(); if(u >0) ( if(isPrime(u)) ( System.out.println("Ingresaste un número primo"); ) else ( System.out.print("Factores primos del número: "); for(int i = (int) Math.sqrt(u); i >= 2 ; i--) ( if(u%i == 0 && isPrime(i)) ( System.out.print(i+" "); ) ) Sistema. out.println (); ) ) else ( System.out.println("No ingresó un número positivo"); ) ) else ( System.out.println("No ingresó un número entero"); ) ) )

En el siguiente ejemplo, se crearán varios métodos con el mismo nombre debido a una sobrecarga.

La primera versión del método simplemente traducirá la cadena, es decir, en realidad será un sinónimo más corto del método integrado System.out.println(). Esta opción no tendrá parámetros.

La segunda variante del método (su primera sobrecarga), comprueba si el argumento numérico tiene parte fraccionaria, si no está allí, entonces el argumento se convierte a números enteros y se muestra en la pantalla sin una parte fraccionaria cero (3 en lugar de 3,0). Este método podrá pasar no solo variables de tipo double, pero también variables de cualquier otro tipo para las que sea posible la conversión automática a double (por ejemplo, cualquier variable entera).

El tercer método con un parámetro simplemente llama al cuarto método, pasando la matriz resultante como parámetros, así como un espacio como segundo parámetro. Tenga en cuenta que estamos llamando a un método que se describirá más adelante en el programa; esto es completamente aceptable.

El cuarto método genera una matriz numérica, procesando cada elemento ya método existente. Después de cada elemento mostrado, se agrega el separador pasado en el parámetro.

Clase pública Principal ( public static void pr() ( System.out.println(); ) public static void pr(double d) ( if((int)d == d) ( System.out.print((int)d ) else ( System.out.print(d); ) ) public static void pr(doble m) ( pr(m, " "); ) public static void pr(doble m, String s) ( for(int i); = 0;< m.length; i++) { pr(m[i]); System.out.print(s); } } public static void main(String args) { double arrn = {1, 2.71, 3.14, 15, -5, 92, 0.5}; double p = 3.0; int k = 13; pr(p); // вывод числа, без дробной части при возможности pr(); // переводит строку pr(arrn); // вывод matriz numérica a la línea pr(); // traduce la cadena pr(arrn,", "); // genera una matriz numérica en una línea separada por comas pr(); // traduce la cadena pr(k); // generar un número entero mediante autocast))

Como resultado de la ejecución del programa, se mostrará lo siguiente en la pantalla:

3 1 2.71 3.14 15 -5 92 0.5 1, 2.71, 3.14, 15, -5, 92, 0.5, 1

Tareas

  1. Cree un método estático que tendrá dos parámetros enteros a y b, y devolverá un entero aleatorio del segmento como valor. con la ayuda este método llene una matriz de 20 números enteros y muéstrela en la pantalla.
  2. Cree un método que muestre la matriz especificada en la pantalla como una cadena. Usando el método creado y el método de la tarea anterior, complete 5 matrices de 10 elementos cada una números aleatorios y muestre las 5 matrices en la pantalla, cada una en una línea separada.
  3. Cree un método que ordene la matriz especificada en orden ascendente de cualquier forma que conozca.
  4. La matriz almacena 7 especificados explícitamente cadenas de texto. Escriba un programa que ordene y muestre cadenas en orden alfabético. Por ejemplo, si se dieran las siguientes líneas:
Pushkin Lermontov Nekrasov Tolstoi L. N. Tolstoi A. N. Yesenin Paustovsky

El programa debería mostrar:

Yesenin Lermontov Nekrasov Paustovsky Pushkin Tolstoi A. N. Tolstoi L. N.

Sugerencia: Primero, necesita crear un método que establezca la relación de orden para las dos cadenas pasadas al método como argumentos.

recursividad

La recursividad es un método (función) que se llama a sí mismo dentro de su cuerpo.

Veamos un ejemplo: cálculo factorial. Para calcular n!, basta con saber y multiplicar (n-1)! y n.

Creemos un método que implemente el método descrito.

Hecho int estático (int n) ( if (n==1) ( devuelve 1; ) else if (n==2) ( devuelve 2; ) else ( devuelve fact(n-1) * n; ) )

El método especificado calcula el factorial de un número natural.

Consideremos un ejemplo que calcula el enésimo número de Fibonacci mediante recursividad.

Recordemos cómo son los primeros elementos de esta serie: 1 1 2 3 5 8 13 ...

Estático int fib (int n) ( if (n==1 || n == 2) ( devuelve 1; ) devuelve fib (n-2) + fib (n-1); )

Tenga en cuenta que en este método el segundo retorno no se coloca en el bloque else para el primero. operador condicional. Esto está permitido, porque si se cumple la condición y se activa el primer retorno, entonces la ejecución del programa del método solo alcanzará el segundo retorno si no se cumple la condición;

Los cálculos recursivos a menudo resultan en la necesidad de repetir las mismas acciones, lo que ralentiza significativamente el programa.

Tareas

  1. Descubra experimentalmente a partir de qué elemento de la secuencia de Fibonacci el cálculo mediante recursividad se vuelve inaceptable (lleva más de un minuto).
  2. Cree un método híbrido que, para n pequeño, calcule el enésimo número de Fibonacci usando recursividad, y para valores mayores que el umbral n que encontró en el problema anterior, calcule el enésimo número de Fibonacci usando un algoritmo iterativo (un bucle dentro del cual el valores de dos elementos anteriores de la secuencia).
  3. Calcula cuántas veces sería necesario recalcular el cuarto elemento de la secuencia de Fibonacci para calcular el decimoquinto elemento.

Pila de llamadas

EN caso general V momento actual solo se puede ejecutar uno a la vez el único método de todo el programa. Esto significa que si el método A está diseñado de tal manera que en su cuerpo llama a un método b y él mismo A llamado principal, luego, cuando se inicie el programa, el control se transferirá primero al método principal, entonces método A, entonces método b. Método b devolverá el resultado y el control a A, A devolverá el resultado del control a principal, y sólo entonces serán ejecutados comandos básicos especificado en el método principal en las líneas restantes después de la llamada a.

Toda la jerarquía (quién llamó a quién) se almacena en un área de memoria especial llamada pila de llamadas. Los elementos se agregan a este fragmento de memoria de acuerdo con el siguiente principio: el último elemento agregado debe recuperarse primero. ¿Cuándo funciona el método? b, resulta que debajo en la pila hay un método a y metodo principal.

Debido a esto, existe el peligro de que la pila de llamadas se desborde durante el proceso de recursividad.

Existe la llamada recursividad compleja, en la que el método A llama a un método b, b causas Con, A Con causas A.

2010, Alexey Nikolaevich Kostin. Departamento de TIDM Facultad de Matemáticas MPGU.




Arriba