Para un tratamiento más general de los fenómenos recursivos, ver el artículo deRecursió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.
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.
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.
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
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. cambiarrunning_total a (running_total × n)
3. decrementarn
4. repetir el loop
3. returnrunning_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
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]
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. setremainder to the remainder of x/y
3. set x to y
4. set y to remainder
5. repeat loop
3. returnx 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.
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:
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]
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 */intsearch(int*data,inttoFind,intcount){// Start = 0 (índice inicial)// End = count - 1 (índice superior)returnbinary_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 */intbinary_search(int*data,inttoFind,intstart,intend){//Averigua el punto medio.intmid=start+(end-start)/2;//División de enteros//Condición para detenerse.if(start>end)return-1;elseif(data[mid]==toFind)//Encontrado?returnmid;elseif(data[mid]>toFind)//El dato es mayor que ''toFind'', se busca en la mitad inferiorreturnbinary_search(data,toFind,start,mid-1);else//El dato es menor que ''toFind'', se busca en la mitad superiorreturnbinary_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.
structnode{intn;// algún tipo de datosstructnode*next;// puntero a otro nodo de ''struct''};// LIST no es otra cosa que un nodo de ''struct'' *.typedefstructnode*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.
voidprintList(LISTlst){if(!isEmpty(lst))// caso básico{printf("%d ",lst->n);// imprime el entero seguido por un espacioprintList(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).
structnode{intn;// algún tipo de datosstructnode*left;// puntero al subárbol izquierdostructnode*right;// puntero al subárbol derecho};// TREE no es otra cosa que un nodo '' struct ''typedefstructnode*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.
voidprintTree(TREEt){if(!isEmpty(t)){// caso básico printTree(t->left);// ir a la izquierdaprintf("%d ",t->n);// imprimir el entero seguido de un espacioprintTree(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 > 0intgcd(intx,inty){if(y==0)returnx;elsereturngcd(y,x%y);}
//Entrada: n es un entero de forma que n >= 1intfact(intn){if(n==1)return1;elsereturnn*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:
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.
↑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.La referencia utiliza el parámetro obsoleto |coautores= (ayuda)
↑Felleisen, Matthias (2002). «Developing Interactive Web Programs». En Jeuring, Johan, ed. Advanced Functional Programming: 4th International School. Oxford, Reino Unido: Springer. pp. 108..
↑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.La referencia utiliza el parámetro obsoleto |coautores= (ayuda)
ИсламСтолпы ислама Свидетельство веры Молитва Пост Милостыня Паломничество Столпы веры Аллах (Единобожие) Ангелы Пророки Писания Судный день Предопределение История и представители Мухаммед Халифы Сахаба Ансары Мухаджиры Саляфы 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...
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 зветься Корейська Пресвітеріянсь�...
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...