Recursión (ciencias de computación)

Para un tratamiento más general de los fenómenos recursivos, ver el artículo de Recursión.

Recursión es, en ciencias de la computación, una forma de atajar y solventar problemas. De hecho, recursión es una de las ideas centrales de ciencia de computación.[1]​ Resolver un problema mediante recursión significa que la solución depende de las soluciones de pequeñas instancias del mismo problema.[2]

El poder de la recursión evidentemente se fundamenta en la posibilidad de definir un conjunto infinito de objetos con una declaración finita. Igualmente, un número infinito de operaciones computacionales puede describirse con un programa recursivo finito, incluso en el caso de que este programa no contenga repeticiones explícitas."[3]

La mayoría de los lenguajes de programación dan soporte a la recursión permitiendo a una función llamarse a sí misma desde el texto del programa. Los lenguajes imperativos definen las estructuras de loops como while y for que son usadas para realizar tareas repetitivas. Algunos lenguajes de programación funcionales no definen estructuras de loops sino que posibilitan la recursión llamando código de forma repetitiva. La teoría de la computabilidad ha demostrado que estos dos tipos de lenguajes son matemáticamente equivalentes, es decir que pueden resolver los mismos tipos de problemas, aunque los lenguajes funcionales carezcan de las típicas estructuras while y for.

Árbol basado en la recursión creado usando el lenguaje de programación Logo.

Algoritmos recursivos

Generalmente, si la primera llamada al subprograma se plantea sobre un problema de tamaño u orden N, cada nueva ejecución recurrente del mismo se planteará sobre problemas, de igual naturaleza que el original, pero de un tamaño menor que N. De esta forma, al ir reduciendo progresivamente la complejidad del problema que resolver, llegará un momento en que su resolución sea más o menos trivial (o, al menos, suficientemente manejable como para resolverlo de forma no recursiva). En esa situación diremos que estamos ante un caso base de la recursividad.

Las claves para construir un subprograma recurrente son:

  • Cada llamada recurrente se debería definir sobre un problema de menor complejidad (algo más fácil de resolver).
  • Ha de existir al menos un caso base para evitar que la recurrencia sea infinita.

Es frecuente que los algoritmos recurrentes sean más ineficientes en tiempo que los iterativos aunque suelen ser mucho más breves en espacio.

Un método frecuente para simplificar es dividir un problema en problemas derivados de menor tamaño del mismo tipo. Esto se conoce como dialecting. Como técnica de programación se denomina divide y vencerás y es pieza fundamental para el diseño de muchos algoritmos de importancia, así como parte esencial de la programación dinámica.

Virtualmente todos los lenguajes de programación modernos permiten la especificación directa de funciones y subrutinas recursivas. Cuando se llama una función de este tipo, el ordenador, para la mayoría de los lenguajes en casi todas las arquitecturas basadas en una pila (stack) o en la implementación del lenguaje, lleva la cuenta de las distintas instancias de la función, en numerosas arquitecturas mediante el uso de un call stack, aunque no de forma exclusiva. A la inversa, toda función recursiva puede transformarse en una función iterativa usando un stack.

La mayoría (aunque no todas) de las funciones y subrutinas que pueden ser evaluadas por un ordenador, pueden expresarse en términos de una función recursiva (sin tener que utilizar una iteración pura); a la inversa, cualquier función recursiva puede expresarse en términos de una iteración pura, dado que la recursión es, de por sí, también iterativa. Para evaluar una función por medio de la recursión, tiene que definirse como una función de sí misma (ej. el factor n! = n * (n - 1)! , donde 0! se define como 1). Resulta evidente que no todas las evaluaciones de funciones se prestan a un acercamiento recursivo. Por lo general, todas las funciones finitas pueden describirse directamente de forma recursiva; las funciones infinitas (ej. las series de e = 1/1! + 2/2! + 3/3!...) necesitan un criterio extra para detenerse, ej. el número de iteraciones, o el número de dígitos significativos, en caso contrario una iteración recursiva resultaría en un bucle infinito.

A modo de ilustración: Si se encuentra una palabra desconocida en un libro, el lector puede anotar la página actual en un papel y ponerlo en una pila (hasta entonces vacía). El lector consulta la palabra en otro artículo y, de nuevo, descubre otra palabra desconocida, la anota y la pone en la pila, y así sucesivamente. Llega un momento que el lector lee un artículo que donde todas las palabras son conocidas. El lector retorna entonces a la última página y continua la lectura desde ahí, y así hasta que se retira la última nota de la pila retornando entonces al libro original. Este modus operandi es recursivo.

Algunos lenguajes diseñados para programación lógica y programación funcional ofrecen la recursión como el único medio de repetición directa disponible para el programador. Estos lenguajes suelen conseguir que la recursión de cola sea tan eficiente como la iteración, permitiendo a los programadores expresar otras estructuras repetitivas (tales como map y for de scheme) en términos de recursión.

La recursión está profundamente anclada en la teoría de computación, con la equivalencia teórica de función microrecursiva y máquinas de Turing en la cimentación de ideas sobre la universalidad del ordenador moderno.


Programación recursiva

Crear una subrutina recursiva requiere principalmente la definición de un "caso base", y entonces definir reglas para subdividir casos más complejos en el caso base. Para una subrutina recursiva es esencial que con cada llamada recursiva, el problema se reduzca de forma que al final llegue al caso base.

Algunos expertos clasifican la recursión como "generativa" o bien "estructural". La distinción se hace según de donde provengan los datos con los que trabaja la subrutina. Si los datos proceden de una estructura de datos similar a una lista, entonces la subrutina es "estructuralmente recursiva"; en caso contrario, es "generativamente recursiva".[4]

Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datos aportados y recurren a partir de ahí. HTDP (How To Design Programs), al español, "Cómo diseñar programas", se refiere a esta variante como recursión generativa. Ejemplos de recursión generativa incluyen: máximo común divisor, quicksort, búsqueda binaria, mergesort, Método de Newton, fractals e integración adaptiva.[5]

Ejemplos de subrutinas definidas recursivamente (recursión generativa)

Factorial

Un ejemplo clásico de una subrutina recursiva es la función usada para calcular el factorial de un entero.

Definición de la función:

Pseudocódigo (recursivo):
función factorial:
input: entero n de forma que n >= 0
output: [n × (n-1) × (n-2) × … × 1]
1. if n es 0, return 1 2. else, return [ n × factorial(n-1) ]
end factorial


Una relación recurrente es una ecuación que relaciona términos posteriores en la secuencia con términos previos.[6]

Relación recurrente de un factorial:

Computando la relación recurrente para n = 4:
b4           = 4 * b3
= 4 * 3 * b2 = 4 * 3 * 2 * b1 = 4 * 3 * 2 * 1 * b0 = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1 = 4 * 3 * 2 = 4 * 6 = 24


Esta función factorial también puede describirse sin usar recursión haciendo uso de típicas estructuras de bucle que se encuentran en lenguajes de programación imperativos:

Pseudocódigo (iterativo):
función factorial es:
input: entero n de forma que n >= 0
output: [n × (n-1) × (n-2) × … × 1]
1. crear una variable nueva llamada running_total con un valor = 1
2. begin loop 1. si n es = 0, salir del loop 2. cambiar running_total a (running_total × n) 3. decrementar n 4. repetir el loop
3. return running_total
end factorial

El lenguaje de programación scheme es, sin embargo, un lenguaje de programación funcional y no define estructuras de loops de cualquier tipo. Se basa únicamente en la recursión para ejecutar todo tipo de loops. Dado que scheme es recursivo de cola, se puede definir una subrutina recursiva que implementa la subrutina factorial como un proceso iterativo, es decir, usa espacio constante pero tiempo lineal.

Fibonacci

Otra popular secuencia recursiva es el Número de Fibonacci. Los primeros elementos de la secuencia son: 0, 1, 1, 2, 3, 5, 8, 13, 21...

Definición de la función:

Pseudocódigo
function fib is:
input: entero n de forma que n >= 0

1. si n es = 0, return 0 2. si n es = 1, return 1 3. else, return [ fib(n-1) + fib(n-2) ]
end fib

Relación recurrente para Fibonacci:
bn = bn-1 + bn-2
b1 = 1, b0 = 0

Computando la relación recurrente para n = 4:
  b4            = b3 + b2
                = b2 + b1 + b1 + b0
                = b1 + b0 + 1 + 1 + 0
                = 1 + 0 + 1 + 1 + 0
                = 3

Este algoritmo de Fibonacci es especialmente malo pues cada vez que se ejecuta la función, realizará dos llamadas a la función a sí misma, cada una de las cuales hará a la vez dos llamadas más y así sucesivamente hasta que terminen en 0 o en 1. El ejemplo se denomina "recursión de árbol", y sus requisitos de tiempo crecen de forma exponencial y los de espacio de forma lineal.[7]

Máximo común divisor

Otro famosa función recursiva es el algoritmo de Euclides, usado para computar el máximo común divisor de dos enteros.

Definición de la función:

Pseudocódigo (recursivo):
function gcd is:
input: entero x, entero y de forma que x >= y y y > 0

1. if y is 0, return x 2. else, return [ gcd( y, (remainder of x/y) ) ]
end gcd

Relación recursiva del máximo común denominador, donde expresa el resto de la división entera :

Computando la relación recurrente para x = 27 e y = 9:
gcd(27, 9)   = gcd(9, 27 % 9)
             = gcd(9, 0)
             = 9
Computando la relación recurrente para x = 259 e y = 111:
gcd(259, 111)   = gcd(111, 259 % 111)
                = gcd(111, 37)
                = gcd(37, 0)
                = 37

Nótese que el algoritmo "recursivo" mostrado arriba es, de hecho, únicamente de cola recursiva, lo que significa que es equivalente a un algoritmo iterativo. En el ejemplo siguiente se muestra el mismo algoritmo usando explícitamente iteración. No acumula una cadena de operaciones deferred, sino que su estado es, más bien, mantenido completamente en las variables x e y. Su "number of steps grows the as the logarithm of the numbers involved. ",[8]​ al español "número de pasos crece a medida que lo hace el logaritmo de los números involucrados."

Pseudocódigo:
función gcd es:
input: entero x, entero y de forma que x >= y e y > 0
1. crear una nueva variable llamada remainder
2. begin loop 1. if y is zero, exit loop 2. set remainder to the remainder of x/y 3. set x to y 4. set y to remainder 5. repeat loop
3. return x
end gcd

El algoritmo iterativo requiere una variable temporal, e incluso supuesto el conocimiento del Algoritmo de Euclides es más difícil de entender el proceso a simple vista, aunque los dos algoritmos son muy similares en sus pasos.

Torres de Hanói

Para una detallada discusión de la descripción de este problema, de su historia y de su solución, consúltese el artículo principal.[9][10]​ El problema, puesto de forma simple, es el siguiente: Dadas 3 pilas, una con un conjunto de N discos de tamaño creciente, determina el mínimo (óptimo) número de pasos que lleva mover todos los discos desde su posición inicial a otra pila sin colocar un disco de mayor tamaño sobre uno de menor tamaño.

Definición de la función:

Relación de recurrencia para hanoi:

Computación de la relación de recurrencia para n = 4:
hanoi(4)     = 2*hanoi(3) + 1
             = 2*(2*hanoi(2) + 1) + 1
             = 2*(2*(2*hanoi(1) + 1) + 1) + 1
             = 2*(2*(2*1 + 1) + 1) + 1
             = 2*(2*(3) + 1) + 1
             = 2*(7) + 1
             = 15


Ejemplos de implementación:

Pseudocódigo (recursivo):
function hanoi is:
input: integer n, such that n >= 1
1. if n is 1 then return 1
2. return [2 * [call hanoi(n-1)] + 1]
end hanoi


Aunque no todas las funciones recursivas tienen una solución explícita, la secuencia de la Torre de Hanói puede reducirse a una fórmula explícita.[11]

Una fórmula explícita de las Torres de Hanói:
h1 = 1   = 21 - 1
h2 = 3   = 22 - 1
h3 = 7   = 23 - 1
h4 = 15  = 24 - 1
h5 = 31  = 25 - 1
h6 = 63  = 26 - 1
h7 = 127 = 27 - 1
Por lo general:
hn = 2n - 1, for all n >= 1

Búsqueda binaria

El algoritmo de búsqueda binaria es un método de búsqueda de un dato en un vector de datos ordenado dividiendo el vector en dos tras cada pasada. El truco es escoger un punto cerca del centro del vector, comparar en ese punto el dato con el dato buscado para responder entonces a una de las siguientes 3 condiciones: se encuentra el dato buscado, el dato en el punto medio es mayor que el valor buscado o el dato en el punto medio es menor que el valor buscado.

Se usa recursión en este algoritmo porque tras cada pasada se crea un nuevo vector dividiendo en original en dos. La subrutina de búsqueda binaria se llama entonces de forma recursiva, cada vez con un vector de menor tamaño. El tamaño del vector se ajusta normalmente cambiando el índice inicial y final. El algoritmo muestra un orden logaritmo de crecimiento porque divide esencialmente el dominio del problema en dos tras cada pasada.

Ejemplo de implementación de la búsqueda binaria:

 /*
  Call binary_search with proper initial conditions.
  
  Entrada: 
    Los datos se presentan en forma de vector de [[número entero|números enteros]] ordenado de forma ascendente,
    ''toFind'' es el número entero a buscar,
    ''count'' es el número total de elementos del vector
           
  Salida:
    resultado de la búsqueda binaria
   
 */
 int search(int *data, int toFind, int count)
 {
    //  Start = 0 (índice inicial)
    //  End = count - 1 (índice superior)
    return binary_search(data, toFind, 0, count-1);
 }

 /*
   Algoritmo de la búsqueda binaria.
   
   Entrada: 
        Los datos se presentan en forma de vector de [[número entero|números enteros]] ordenado de forma ascendente,
        ''toFind'' es el número entero a buscar,
        ''start'' es el índice mínimo del vector,
        ''end'' es el índice máximo del vector
   Salida: 
        posición del número entero ''toFind'' dentro del vector de datos, 
        -1 en caso de búsqueda fallida
 */
 int binary_search(int *data, int toFind, int start, int end)
 {
    //Averigua el punto medio.
    int mid = start + (end - start)/2;   //División de enteros
    
    //Condición para detenerse.
    if (start > end)
       return -1;
    else if (data[mid] == toFind)        //Encontrado?
       return mid;
    else if (data[mid] > toFind)         //El dato es mayor que ''toFind'', se busca en la mitad inferior
       return binary_search(data, toFind, start, mid-1);
    else                                 //El dato es menor que ''toFind'', se busca en la mitad superior
       return binary_search(data, toFind, mid+1, end);
 }

Estructuras de datos recursivo (recursión estructural)

Una aplicación de importancia de la recursión en ciencias de la computación es la definición de estructuras de datos dinámicos tales como listas y árboles. Las estructuras de datos recursivos pueden crecer de forma dinámica hasta un tamaño teórico infinito en respuesta a requisitos del tiempo de ejecución; por su parte, los requisitos del tamaño de un vector estático deben declararse en el tiempo de complicación.

"Los algoritmos recursivos son especialmente apropiados cuando el problema que resolver o los datos que manejar son definidos en términos recursivos."[12]

Los ejemplos en esta sección ilustran lo que se conoce como "recursión estructural". Este término se refiere al hecho de que las subrutinas recursivas se aplican a datos que se definen de forma recursiva.

En la medida en que un programador deriva una plantilla de una definición de datos, las funciones emplean recursión estructural. Es decir, las recursiones en el cuerpo de una función consumen una determinada cantidad de un compuesto dado de forma inmediata.[13]

Listas enlazadas

A continuación se describe una definición simple del nodo de una lista enlazada. Nótese como se define el nodo por sí solo. El siguiente elemento del nodo del struct es un puntero a un nodo de struct.

struct node
{
  int n;              // algún tipo de datos
  struct node *next;  // puntero a otro nodo de ''struct''
};

// LIST no es otra cosa que un nodo de ''struct'' *.
typedef struct node *LIST;

Las subrutinas que operan en la estructura de datos de LIST pueden implementarse de forma natural como una subrutina recursiva porque la estructura de datos sobre la que opera (LIST) es definida de forma recursiva. La subrutina printList definida a continuación recorre la lista hacia abajo hasta que ésta se vacía (NULL), para cada nodo imprime el dato (un número entero). En la implementación en C, la lista permanece inalterada por la subrutina printList.

void printList(LIST lst)
{
    if (!isEmpty(lst))         // caso básico
    {
       printf("%d ", lst->n);  // imprime el entero seguido por un espacio
       printList(lst->next);   // llamada recursiva
    }
}

Árboles binarios

Más abajo se muestra una definición simple de un nodo de árbol binario. Al igual que el nodo de listas enlazadas, se define a sí misma (de forma recursiva). Hay dos punteros que se refieren a sí mismos – left (apuntando a l aparte izquierda del subárbol) y right (a la parte derecha del subárbol).

struct node
{
  int n;               // algún tipo de datos
  struct node *left;   // puntero al subárbol izquierdo
  struct node *right;  // puntero al subárbol derecho
};

// TREE no es otra cosa que un nodo '' struct ''
typedef struct node *TREE;

Las operaciones en el árbol pueden implementarse usando recursión. Nótese que, debido al hecho de que hay dos punteros que se referencian a sí mismos (izquierda y derecha), esas operaciones del árbol van a necesitar dos llamadas recursivas. Para un ejemplo similar, véase la función de Fibonacci y la explicación siguiente.

void printTree(TREE t) {
        if (!isEmpty(t)) {            // caso básico                          
                printTree(t->left);   // ir a la izquierda
                printf("%d ", t->n);  // imprimir el entero seguido de un espacio
                printTree(t->right);  // ir a la derecha
        }
}

El ejemplo descrito ilustra un árbol binario de orden transversal. Un árbol de búsqueda binaria es un caso especial de árbol binario en el cual los datos de cada árbol están en orden.

Recursión frente a iteración

En el ejemplo "factorial" la implementación iterativa es probablemente más rápida en la práctica que la recursiva. Esto es casi definido por la implementación del algoritmo euclidiano. Este resultado es lógico, pues las funciones iterativas no tienen que pagar el exceso de llamadas de funciones como en el caso de las funciones recursivas, y ese exceso es relativamente alto en muchos lenguajes de programación (nótese que mediante el uso de una lookup table es una implementación aún más rápida de la función factorial).

Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas, porque estar al tanto del estado anterior. Un ejemplo es el árbol transversal; otros incluyen la función de Ackermann y el algoritmo divide y vencerás tales como Quicksort. Todos estos algoritmos pueden implementarse iterativamente con la ayuda de una pila, pero la necesidad del mismo, puede que anule las ventajas de la solución iterativa.

Otra posible razón para la utilización de un algoritmo iterativo en lugar de uno recursivo es el hecho de que en los lenguajes de programación modernos, el espacio de stack disponible para un hilo es, a menudo, mucho menos que el espacio disponible en el montículo, y los algoritmos recursivos suelen requerir más espacio de stack que los algoritmos iterativos. Véase, por otro lado, la sección siguiente que trata el caso especial de la recursión de cola.

Funciones de recursión de cola

Funciones de recursión de cola son funciones que finalizan con una llamada recursiva que no crea ninguna operación deferida. Por ejemplo, la función gcd (se muestra de nuevo más abajo) es recursiva de cola; sin embargo, la función factorial (que también se muestra más abajo) no es recursiva de cola porque crea operaciones diferidas que tienen que realizarse incluso después de que se complete la última llamada recursiva. Con un compilador que automáticamente optimiza llamadas recursivas de cola, una función recursiva de cola, como por ejemplo gcd, se ejecutará usando un espacio constante. Así, el proceso que genera es esencialmente iterativo y equivalente a usar estructuras de control de lenguaje imperativo como los bucles for y while.

Recusión de cola: Recursión en aumento:
//Entrada: Los enteros x e y, de forma que x >= y e y > 0
int gcd(int x, int y)
{
  if (y == 0)
     return x;
  else
     return gcd(y, x % y);
}
//Entrada: n es un entero de forma que n >= 1
int fact(int n)
{
   if (n == 1)
      return 1;
   else
      return n * fact(n - 1);
}

La importancia de recursión de cola es que cuando se realiza una llamada recursiva de cola, la posición de retorno de la función que llama necesita grabarse en el call stack; cuando la función recursiva retorna, continuará directamente a partir de la posición de retorno grabada previamente. Por ello, en compiladores que dan soporte a optimización de recursión de cola, este tipo de recursión ahorra espacio y tiempo.

Orden en la invocación de una función

El orden de invocación de una función puede alterar la ejecución de una función, véase este ejemplo en C:

Función 1

void recursiveFunction(int num) {
   if (num < 5) {
      printf("%d\n", num);
      recursiveFunction(num + 1);
   }
}

Función 2 con líneas cambiadas

void recursiveFunction(int num) {
   if (num < 5) {
      recursiveFunction(num + 1);
      printf("%d\n", num);
   }
}

Recursión directa e indirecta

Se habla de recursión directa cuando la función se llama a sí misma. Se habla de recursión indirecta cuando, por ejemplo, una función A llama a una función B, que a su vez llama a una función C, la cual llama a la función A. De esta forma es posible crear largas cadenas y ramificaciones, véase Parser descendente recursivo.

Véase también

Notas y referencias

  1. Epp, Susanna (1995). Discrete Mathematics with Application (2. edición). p. 427. 
  2. Graham, Ronald; Donald Knuth, Oren Patashnik (1990). Concrete Mathematics. Capítulo 1: Recurrent Problems. Archivado desde el original el 6 de noviembre de 2020. Consultado el 30 de noviembre de 2011. 
  3. Wirth, Niklaus (1976). Algorithms + Data Structures = Programs. Prentice-Hall. p. 126. 
  4. Felleisen, Matthias; Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi (2001). How to Design Programs: An Introduction to Computing and Programming. Cambridge, MASS: MIT Press. p. art V "Generative Recursion". 
  5. Felleisen, Matthias (2002). «Developing Interactive Web Programs». En Jeuring, Johan, ed. Advanced Functional Programming: 4th International School. Oxford, Reino Unido: Springer. pp. 108. .
  6. Epp, Susanna (1995). Discrete Mathematics with Applications. Brooks-Cole Publishing Company. p. 424. 
  7. Abelson, Harold; Gerald Jay Sussman (1996). Structure and Interpretation of Computer Programs. Sección 1.2.2. Archivado desde el original el 3 de septiembre de 2006. Consultado el 13 de mayo de 2010. 
  8. Abelson, Harold; Gerald Jay Sussman (1996). Structure and Interpretation of Computer Programs. Section 1.2.5. Archivado desde el original el 3 de septiembre de 2006. Consultado el 13 de mayo de 2010. 
  9. Graham, Ronald; Donald Knuth, Oren Patashnik (1990). Concrete Mathematics. Chapter 1, Section 1.1: The Tower of Hanoi. Archivado desde el original el 6 de noviembre de 2020. Consultado el 30 de noviembre de 2011. 
  10. Epp, Susanna (1995). Discrete Mathematics with Applications (2nd edición). pp. 427-430: The Tower of Hanoi. 
  11. Epp, Susanna (1995). Discrete Mathematics with Applications (2nd edición). pp. 447-448: An Explicit Formula for the Tower of Hanoi Sequence. 
  12. Wirth, Niklaus (1976). Algorithms + Data Structures = Programs. Prentice-Hall. p. 127. 
  13. Felleisen, Matthias (2002), «Developing Interactive Web Programs», en Jeuring, Johan, ed., Advanced Functional Programming: 4th International School, Oxford, UK: Springer, p. 108 ..

Enlaces externos

Read other articles:

ИсламСтолпы ислама Свидетельство веры Молитва Пост Милостыня Паломничество Столпы веры Аллах (Единобожие) Ангелы Пророки Писания Судный день Предопределение История и представители Мухаммед Халифы Сахаба Ансары Мухаджиры Саляфы 12 имамов Основные течения Сунниты Ши

Hell in a CellPoster promosi menampilkan The UndertakerInformasiPromotorWorld Wrestling EntertainmentMerekRawSmackDownECWTanggal4 Oktober 2009Kehadiran12,356[1]TempatPrudential CenterLokasiNewark, New JerseyKronologi Bayar-per-tayang Breaking Point Hell in a Cell Bragging Rights Kronologi Hell in a Cell Pertama Hell in a Cell 2010 Hell in a Cell (2009) adalah acara tayangan berbayar gulat profesional Hell in a Cell perdana yang diproduksi oleh World Wrestling Entertainment (WWE). Acar...

佐賀県の「有田町」とは異なります。 ありだし 有田市 有田みかんの山 有田市旗 有田市章1956年4月10日制定 国 日本地方 近畿地方都道府県 和歌山県市町村コード 30204-0法人番号 5000020302040 面積 36.83km2総人口 24,977人 [編集](推計人口、2023年11月1日)人口密度 678人/km2隣接自治体 海南市、有田郡有田川町、湯浅町市の木 シイ市の花 ミカン市の鳥 なし有田市役所市長 [編

Hành trình kết nối những trái timLogo chương trìnhThể loạiTruyền hình thực tếĐạo diễnĐỗ Đức Thịnh[1] Đào Duy Phúc[1] Nguyễn Mạnh Hà[1] Trịnh Lê Phong[1] Hữu Đức[1] Võ Thắng[1] Xuân Phước[1]Dẫn chuyệnXem danh sáchNhạc phimNguyễn Thăng Long Giang Tiểu Hổ Phạm Vũ Tiến Nhạc chủ đềĐón ngày đẹp tươi (Võ Thiện Thanh) Cơn gió lạ (Phạm Anh Dũng)...

Museo Numismático de Atenas Sede del museoUbicaciónPaís GreciaLocalidad AtenasCoordenadas 37°58′40″N 23°44′07″E / 37.9778, 23.7354Tipo y coleccionesTipo Museo numismáticoHistoria y gestiónCreación 1834Sitio web oficial[editar datos en Wikidata] El Museo Numismático de Atenas (en griego: Νομισματικό Μουσείο Αθηνών) está situado en la casa de Heinrich Schliemann, que fue diseñada por el arquitecto alemán Ernst Ziller. Present...

Marquês de Ávila Marquês de Ávila Criação D. Luís I24 de Maio de 1870 Ordem 31 de Maio de 1870 Tipo Vitalício – 1 vida1 renovação 1.º Titular António José de Ávila Linhagem de Ávila Marquês de Ávila é um título nobiliárquico criado por D. Luís I de Portugal, por Decreto de 24 e Carta de 31 de Maio de 1870, em favor de António José de Ávila, antes 1.º Conde de Ávila e depois 1.° Duque de Ávila e Bolama.[1] Titulares António José de Ávila, 1.º Conde e 1.º Marq...

Euclid Ciudad Bandera EuclidUbicación en el condado de Cuyahoga en Ohio Ubicación de Ohio en EE. UU.Coordenadas 41°35′44″N 81°31′09″O / 41.595555555556, -81.519166666667Entidad Ciudad • País  Estados Unidos • Estado  Ohio • Condado CuyahogaFundación 1796Superficie   • Total 29.74 km² • Tierra 27.53 km² • Agua (7.42%) 2.21 km²Altitud   • Media 192 m s. n. m.Población (2010)  &#...

Discontinued virtual assistant by Facebook MDeveloper(s)Facebook, Inc. M was a virtual assistant by Facebook, first announced in August 2015, that claimed to automatically complete tasks for users, such as purchase items, arrange gift deliveries, reserve restaurant tables, and arrange travel. It was intended to compete with services such as Siri and Cortana.[1] [2] In practice, over 70% of requests were answered by human operators. History By April 2017, M was available to a s...

1954 film Guai ai vintiDirected byRaffaello MatarazzoWritten byAchille CampanileRaffaello MatarazzoMario MonicelliPiero PierottiGiovanna SoriaCinematographyTino SantoniEdited byMario SerandreiMusic byCarlo FranciRenzo RosselliniRelease date3 November 1954 Guai ai vinti (Woe to the Vanquished Ones) is a 1954 Italian melodrama film directed by Raffaello Matarazzo. It is based on the novel Vae Victis by Annie Vivanti.[1][2] Plot During the First World War the Italian front at Cap...

Andika HazrumyWakil Gubernur Banten ke-4Masa jabatan12 Mei 2017 – 12 Mei 2022GubernurWahidin HalimPendahuluRano KarnoAnggota Dewan Perwakilan RakyatRepublik IndonesiaMasa jabatan1 Oktober 2014 – 24 Oktober 2016PenggantiAce Hasan SyadzilyDaerah pemilihanBanten IAnggota Dewan Perwakilan DaerahRepublik IndonesiaMasa jabatan1 Oktober 2009 – 1 Oktober 2014Daerah pemilihanBanten Informasi pribadiLahir16 Desember 1985 (umur 37)Bandung, Jawa Barat, IndonesiaK...

Main article: 2011 in association football The year of 2011 in CONCACAF marked the 48th year of CONCACAF competitions. Events Men Javier Hernandez, of Mexico, earned the Golden boot in the 2011 Gold Cup, scoring seven goals in the tournament, including a hat trick against El Salvador. From 5 June through 25 June, CONCACAF hosted its eleventh biannual regional tournament, the CONCACAF Gold Cup. Hosted in the United States, it was the fourth-consecutive tournament that the Gold Cup was solely h...

Candi Laras UtaraKecamatanPeta lokasi Kecamatan Candi Laras UtaraNegara IndonesiaProvinsiKalimantan SelatanKabupatenTapinPemerintahan • CamatH. Parianata, S.APPopulasi • Total16,115 jiwa (2.010) jiwaKode Kemendagri63.05.06 Kode BPS6305100 Luas730,48 km²Desa/kelurahan13/- Candi Laras Utara adalah sebuah kecamatan di Kabupaten Tapin, provinsi Kalimantan Selatan, Indonesia. Batas wilayah Batas-batas wilayah kecamatan Candi Laras Utara adalah sebagai berikut: Utara K...

Industrial business based in UK Consett Iron CompanyIndustryIronmakingFounded1864Defunct1980HeadquartersConsett, County DurhamProductsIron and steelNet income£673 million (1900)OwnerBritish Steel Corporation (1967)Number of employees6000 (1892)Websitehttp://www.dmm.org.uk/company/c002.htm The Consett Iron Company Ltd was an industrial business based in the Consett area of County Durham in the United Kingdom. The company owned coal mines and limestone quarries, and manufactured iron and steel...

Russian actor In this name that follows Eastern Slavic naming conventions, the patronymic is Platonovna and the family name is Zuyeva . Anastasia ZuyevaAnastasia Zuyeva as Agrafena in The Bright Path (1940)BornAnastasia Platonovna Zuyeva(1896-12-17)17 December 1896Venyovsky Uyezd, Tula Governorate, Russian Empire[1]Died23 March 1986(1986-03-23) (aged 89)Moscow, Soviet UnionOccupation(s)Actress, memoiristYears active1916–1982SpouseViktor Oransky (1899-1953)[2]Aw...

Award presented by National Academy of Recording Arts and Sciences Record of the Year redirects here. For other uses, see Record of the Year (disambiguation). Grammy Award for Record of the YearAbout Damn Time by Lizzo is the most recent recipientAwarded forQuality vocal or instrumental recording tracksCountryUnited StatesPresented byNational Academy of Recording Arts and SciencesFirst awarded1959Currently held byLizzo – About Damn Time (2023)Websitegrammy.com The Grammy Award for Record of...

Eksarkatus AfrikaExarchatus AfricaeEksarkatus di Kekaisaran Romawi Timur585/590–698Wilayah sekitar Laut Mediterania pada 650,   Eksarkatus Afrika  Romawi BizantiumIbu kotaKartagoSejarahEra sejarahAbad Pertengahan Awal• Pembentukan eksarkatus 585/590• Invasi Arab pertama 647• Pertempuran Kartago (698) 698 Didahului oleh Digantikan oleh Prefektur Praetor Afrika Kekhalifahan Rasyidin Kekhalifahan Umayyah Eksarkatus Afrika atau Kartago, sesuai dengan nam...

Пресвітеріянська Церква Кореї (ПСК, або Тонґхап) - протестантська церква в Південній Кореї, яка є другою за кількістю пресвітеріянською деномінацією у світі. Її дочірньою церквою є Корейська Пресвітеріянська Церква в Америці, яка від 2009 зветься Корейська Пресвітеріянсь�...

1958 film directed by Yuli Khmelnitsky For other uses, see Mister X (disambiguation). Mister IksRussian: Мистер ИксDirected byYuli Khmelnitsky [ru]Written byYuli Khmelnitsky Nora RubinsteinBased onDie Zirkusprinzessinby Emmerich KálmánStarringGeorg OtsCinematographyYuli KhmelnitskyEdited byN. RazumovaMusic byEmmerich KálmánProductioncompanyLenfilmRelease date 1958 (1958) Running time95 minutesCountrySoviet UnionLanguageRussian Mister Iks (Russian: Мистер �...

Lithium metaborate[1] Names Other names boric acid, lithium salt Identifiers CAS Number 13453-69-5 Y 3D model (JSmol) Interactive image ChemSpider 109911 Y ECHA InfoCard 100.033.287 EC Number 236-631-5 PubChem CID 123308 CompTox Dashboard (EPA) DTXSID50894850 InChI InChI=1S/BO2.Li/c2-1-3;/q-1;+1 YKey: HZRMTWQRDMYLNW-UHFFFAOYSA-N YInChI=1/BO2.Li/c2-1-3;/q-1;+1Key: HZRMTWQRDMYLNW-UHFFFAOYAF SMILES [Li+].[O-]B=O Properties Chemical formula LiBO2 Molar ...

American politician For the drummer, see Chester Thompson. Chester C. ThompsonCollections of the U.S. House of RepresentativesMember of the U.S. House of Representativesfrom Illinois's 14th districtIn officeMarch 4, 1933 – January 3, 1939Preceded byJohn Clayton AllenSucceeded byAnton J. Johnson Personal detailsBorn(1893-09-19)September 19, 1893Rock Island, IllinoisDiedJanuary 30, 1971(1971-01-30) (aged 77)Rock Island, IllinoisPolitical partyDemocratic Chester Charl...