¿Por qué se usan las variables "i" y "j" para los contadores?
language-agnostic (23)
Creo que lo más probable es que se derive del índice (en el sentido matemático ): se usa comúnmente como un índice en sumas u otras operaciones basadas en conjuntos, y muy probablemente se haya usado de esa manera desde antes de que hubiera lenguajes de programación.
Sé que esto podría parecer una pregunta absolutamente tonta, pero tengo curiosidad de no preguntar ...
¿Por qué "i" y "j" se convirtieron en las variables a usar como contadores en la mayoría de las estructuras de control?
Aunque el sentido común me dice que son como X, que se usa para representar valores desconocidos, no puedo evitar pensar que debe haber una razón por la que a todos se les enseñe de la misma manera una y otra vez.
¿Es porque en realidad se recomienda para las mejores prácticas, o una convención, o tiene alguna razón oscura detrás de esto?
Por las dudas, sé que puedo darles el nombre que quiera y que los nombres de las variables no son relevantes.
Lo uso por varias razones.
Por lo general, mis loops están basados en int, por lo que haces un triángulo completo en el teclado escribiendo "int i" a excepción del espacio que manejo con el pulgar. Esta es una secuencia muy rápida de escribir.
La "i" podría representar iterador, entero, incremento o índice, cada uno de los cuales tiene sentido lógico.
Con mis usos personales anulados, la teoría de que se deriva de FORTRAN es correcta, donde los vars enteros usaron las letras I - N.
Posiblemente histórico?
FORTRAN, posiblemente el primer lenguaje de alto nivel, definió i, j, k, l, m como tipos de datos enteros por defecto, y los bucles solo podían controlarse mediante una variable entera, la convención continúa?
p.ej:
hacer 100 i = j, 100,5 .... 100 continuar ....
i = iterador, i = índice, i = entero
Cualquiera que sea su figura, "yo" significa que todavía "encaja".
Además, a menos que solo tenga una sola línea de código dentro de ese bucle, probablemente debería estar nombrando la variable iterador / índice / entero a algo más significativo. Me gusta: employeeIndex
Por cierto, suelo usar "i" en mis bucles simples de iterador; a menos que, por supuesto, contenga varias líneas de código.
i = entero
Viene de Fortran donde las variables enteras tuvieron que comenzar con las letras I a N y las variables reales comenzaron con las otras letras. Por lo tanto, yo era el primer y más corto nombre de variable entera. Fortran fue uno de los primeros lenguajes de programación de uso generalizado y los hábitos desarrollados por los programadores que lo utilizan se trasladaron a otros idiomas.
EDITAR : No tengo ningún problema con la respuesta que deriva de las matemáticas. Sin lugar a dudas, es ahí donde los diseñadores de Fortran se inspiraron. El hecho es que, para mí, de todos modos, cuando comencé a programar en Fortran utilizamos I, J, K, ... para los contadores de bucle porque eran cortos y los primeros nombres de variables legalmente permitidos para enteros. Como estudiante de segundo año en HS, probablemente había oído hablar de Descartes (y de algunos otros), pero tenía muy poca conexión con las matemáticas cuando programaba. De hecho, el primer curso que tomé se llamaba "Fortran for Business" y no fue impartido por la facultad de matemáticas, sino por la facultad de negocios / econ.
Para mí, al menos, el nombramiento de variables tenía poco que ver con las matemáticas, pero todo debido a los hábitos que aprendí escribiendo el código de Fortran que llevaba a otros idiomas.
Los matemáticos usaban i, j, k para designar números enteros en álgebra (subíndices, series, sumas, etc.) mucho antes (por ejemplo, 1836 o 1816 ) había computadoras alrededor (este es el origen de los valores predeterminados de la variable FORTRAN). El hábito de usar letras del final del alfabeto (..., x, y, z) para variables desconocidas y desde el principio (a, b, c ...) para constantes generalmente se atribuye a Rene Descartes (ver también aquí ) así que supongo que i, j, k ... n (en el medio del alfabeto) para enteros probablemente también se deba a él.
Creo que data de Fortran. Las variables que comenzaban con I a Q eran enteros por defecto, las otras eran reales. Esto significaba que I
era la primera variable entera, y J
la segunda, etc., por lo que cayeron hacia el uso en bucles.
En última instancia, proviene de las matemáticas: la notación de sumatoria tradicionalmente usa i para el primer índice, j para el segundo, y así sucesivamente. Ejemplo (de http://en.wikipedia.org/wiki/Summation ):
También se usa de esa manera para colecciones de cosas, como si tuviera un conjunto de variables x 1 , x 2 , ... x n , entonces una arbitraria se conocerá como x i .
En cuanto a por qué es así, me imagino que SLaks es correcto y es porque soy la primera letra en Index.
Estos símbolos se usaron como índices matriciales en matemáticas mucho antes de que se inventaran las computadoras electrónicas.
Yo represento I ndex.
j
viene después de i
.
Creo que es porque muchos bucles usan una variable de tipo Int para hacer el conteo, como
for (int i = 0; etc
y cuando tipeas, en realidad lo dices en voz alta (como cuando lees), entonces en tu mente, dices ''int ...''
y cuando tienes que inventar una letra justo después de ''int ...'', dices / escribes ''i'' porque esa es la primera letra que piensas cuando acabas de decir ''int''
Al igual que deletreas una palabra a los niños que comienzan a leer, deletreas palabras para ellos usando nombres como este:
WORD hechizos William W, Ok O, Ruby R, Done D
Entonces dices Int I, Double d, Float f, string s etc. en base a la primera letra.
Y j se usa porque cuando has hecho int I, J sigue justo después.
Creo que es una combinación de las otras razones mencionadas:
Para empezar, los matemáticos solían utilizar ''i'' en su notación, y en los primeros días de la informática con lenguajes que no eran binarios (es decir, tenían que ser analizados y lexados de alguna manera), la gran mayoría de los usuarios de computadoras eran también matemáticos (... y científicos e ingenieros), por lo que la notación se utilizó en los lenguajes de programación para programar bucles, y desde entonces se ha mantenido.
Combine esto con el hecho de que el espacio de la pantalla en esos primeros días era muy limitado, al igual que la memoria, tenía sentido mantener nombres de variables más cortos.
Los contadores son tan comunes en los programas, y en los comienzos de la informática, todo era un lujo ...
Los programadores naturalmente intentaron conservar píxeles, y la ''i'' requirió menos píxeles que cualquier otra letra para representar. (Los matemáticos, siendo flojos, lo escogieron por la misma razón, como el glifo más pequeño).
Como se dijo anteriormente, ''j'' simplemente siguió naturalmente ...
:)
Hay una preferencia en matemáticas para usar letras consecutivas en el alfabeto para variables "anónimas" usadas de manera similar. Por lo tanto, no solo "i, j, k", sino también "f, g, h", "p, q, r", "x, y, z" (raramente con "u, v, w" antepuesto), y "α, β, γ".
Ahora "f, g, h" y "x, y, z" no se usan libremente: el primero es para funciones, el último para dimensiones. "p, q, r" también se utilizan a menudo para funciones.
Luego hay otras restricciones en las secuencias disponibles: "l" y "o" se evitan, porque se parecen mucho a "1" y "0" en muchas fuentes. "t" se usa a menudo para el tiempo, "d & δ" para diferenciales, y "a, s, m, v" para las medidas físicas de aceleración, desplazamiento, masa y velocidad. Eso deja no demasiadas lagunas de tres letras consecutivas sin asociaciones no deseadas en matemáticas para los índices.
Luego, como muchos otros han notado, las convenciones de las matemáticas tuvieron una fuerte influencia en las convenciones de programación temprana, y "α, β, γ" no estaban disponibles en muchos juegos de caracteres tempranos.
Muchas posibles razones principales, supongo:
- los matemáticos usan
i
yj
para Números Naturales en fórmulas (las que usan Números Complejos raramente, al menos), así que esto se transfiere a la programación - desde C , sugiero
int
. Y si necesita otroint
entoncesi2
es demasiado largo, por lo que decide usarj
. - hay idiomas donde la primera letra decide el tipo, y
i
entonces es uninteger
.
Una tarde soleada, Arquímedes reflexiona ( como era habitual en las tardes soleadas ) y se encontró con su amigo Eratóstenes.
Arquímedes dijo: "¡Saludos de Arquímedes a Eratóstenes! Estoy tratando de encontrar una solución a la relación de varios cuerpos rígidos esféricos en equilibrio. Deseo iterar sobre estos cuerpos varias veces, pero estoy teniendo un tiempo espantoso. de cuántas iteraciones he hecho! "
Eratosthenes dijo, "¿Por qué Arquímedes, eres un niño maduro, simplemente puedes marcar sucesivas filas de líneas en la arena, cada una de las cuales hace un seguimiento de la cantidad de iteraciones que has realizado en la iteración?"
Arquímedes le gritó al mundo que su gran amigo era innegablemente un faro de inteligencia brillante para encontrar una solución tan simple. Pero Arquímedes comentó que le gusta caminar en círculos alrededor de su pozo de arena mientras reflexiona. Por lo tanto, había riesgo de perder la pista de qué fila estaba en la parte superior, y cuál estaba en la parte inferior.
"¡Quizás debería marcar estas filas con una letra del abecedario justo a un lado para que yo sepa siempre qué fila es cuál! ¿Qué piensas de eso?" preguntó, y luego agregó, "Pero Eratóstenes ... ¿qué cartas debo usar?"
Eratosthenes estaba seguro de que no sabía qué letras serían las mejores, y lo dijo tanto a Arquímedes. Pero Arquímedes estaba insatisfecho y siguió incitando al pobre bibliotecario a elegir, al menos, las dos letras que necesitaría para su solución actual de equilibrio de esfera.
Eratosthenes, finalmente cansado de la incesante solicitud de dos cartas, gritó, "¡NO SÉ!".
Así que Arquímedes eligió las dos primeras letras en la frase exclamatoria de Eratóstenes, y agradeció a su amigo por la contribución.
Estos símbolos fueron rápidamente adoptados por los antiguos desarrolladores de Java griegos, y el resto es, bueno, la historia.
descartando (un poco sesgado)
a seems an array
b seems another array
c seems a language name
d seems another language name
e seems exception
f looks bad in combination with "for" (for f, a pickup?)
g seems g force
h seems height
i seems an index
j seems i (another index)
k seems a constant k
l seems a number one (1)
m seems a matrix
n seems a node
o seems an output
p sounds like a pointer
q seems a queue
r seems a return value
s seems a string
t looks like time
u reserved for UVW mapping or electic phase
v reserved for UVW mapping or electic phase or a vector
w reserved for UVW mapping or electic phase or a weight
x seems an axis (or an unknown variable)
y seems an axis
z seems a third axis
i = iota, j = jot; ambos pequeños cambios.
iota es la letra más pequeña en el alfabeto griego; en el idioma inglés su significado está relacionado con pequeños cambios, como en "ni un ápice" (de una frase en el Nuevo Testamento: "hasta que el cielo y la tierra pasen, ni un ápice, ni un punto, pasarán de la Ley"). (Mt 5:18)).
Un contador representa un pequeño cambio en un valor.
Y de iota viene jot (iot), que también es sinónimo de un pequeño cambio.
Aprendí FORTRAN en un Control Data Corp. 3100 en 1965. Las variables que comienzan con ''I'' a ''N'' implicaban enteros. Ej: ''IGGY'' y ''NORB'' eran enteros, ''XMAX'' y ''ALPHA'' eran de coma flotante. Sin embargo, puede anular esto a través de una declaración explícita.
Bueno desde las Matemáticas: (para letras latinas)
a, b: se usan como constantes o como números enteros para un número racional
c: una constante
d: derivado
e: número de Euler
f, g, h: funciones
i, j, k: son índices (también vectores unitarios y los cuaterniones)
l: generalmente no usado. parece 1
m, n: son filas y columnas de matrices o como enteros para números racionales
o: tampoco se usa (a menos que esté en una pequeña notación)
p, q: a menudo se usa como primos
r: a veces un cambio espacial de variable otras veces relacionado con números primos
s, t: variables espaciales y temporales o s se usa como un cambio de variable para t
u, v, w: cambio de variable
x, y, z: variables
Definitivamente proviene de las matemáticas, que precedieron mucho a la programación de computadoras.
Entonces, ¿de dónde viene si en matemática? Mi conjetura completamente inculto es que, como dijo un compañero, a los matemáticos les gusta usar clústeres alfabéticos para cosas similares: f, g, h para funciones; x, y, z para variables numéricas; p, q, r para variables lógicas; u, v, w para otros conjuntos de variables, especialmente en cálculo; a, b, c para muchas cosas. i, j, k es útil para variables iterativas, y eso sobre agota las posibilidades. ¿Por qué no m, n? Bueno, se usan para enteros, pero más a menudo son los puntos finales de las iteraciones que las variables iterativas.
Alguien debería preguntarle a un historiador de las matemáticas.
Encontré otra respuesta posible que podría ser que i, jyk provienen de Hamilton''s Quaternions
de Hamilton''s Quaternions
.
Euler eligió a la unidad imaginaria.
Hamilton necesitaba dos raíces cuadradas más de -1: ii = jj = kk = ijk = -1
Hamilton fue realmente influyente, y los cuaterniones fueron la forma estándar de hacer análisis 3D antes de 1900. Para entonces, los matemáticos estaban acostumbrados a pensar en (ijk) como un conjunto combinado. El cálculo vectorial reemplazó el análisis cuaterniónico en la década de 1890 porque era una mejor forma de escribir las ecuaciones de Maxwell. Pero la gente tendía a escribir cantidades de vectores como esta: (3i-2j+k)
lugar de (3,-2,1)
. Entonces (ijk) se convirtió en los vectores de base estándar en R ^ 3.
Finalmente, los físicos comenzaron a usar la teoría de grupos para describir simetrías en sistemas de ecuaciones diferenciales. Así que (ijk) comenzó a connotar "vectores que se intercambian por grupos de permutación", luego se desplazó hacia "elementos tipo índice que toman todos los valores posibles en un conjunto específico", que es básicamente lo que significan en un bucle for.
Viene de Fortran, donde i, j, k, l, m, n son enteros implícitamente.