¿Por qué se utilizan las variables "i" y "j" para los contadores?

179

Sé que esto podría parecer una pregunta absolutamente tonta, pero tengo mucha curiosidad por no preguntar ...

¿Por qué "i" y "j" se convirtieron en LAS variables para 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 cual todos reciben la misma instrucción una y otra vez.

¿Es porque realmente se recomienda para las mejores prácticas, o una convención, o tiene alguna razón oscura detrás de esto?

Por si acaso, sé que puedo darles el nombre que desee y que los nombres de las variables no son relevantes.

Carlos
fuente
17
i = iteración mientras j = después de la
interacción
77
extraño 'c' no fue elegido? como en el registro de contador Intel 'cx'.
12
Coordenadas cartesianas
Nick Dandoulakis
16
¿Por qué las preguntas reales se convierten en wikis de la comunidad solo porque son populares? Esto recuerda mucho al comunismo. Si alguien inventa algo realmente genial, el gobierno roba el invento para compartirlo con la comunidad.
orokusaki
9
Cerrado de manera incorrecta: las respuestas aquí son más informativas que las otras qn ...
Charles Stewart

Respuestas:

330

En última instancia, proviene de las matemáticas: la notación de suma tradicionalmente usa i para el primer índice, j para el segundo, y así sucesivamente. Ejemplo (de http://en.wikipedia.org/wiki/Summation ):

\ sum_ {i = 1} ^ {n} i = \ frac {n ^ 2 + n} {2}

También se usa de esa manera para colecciones de cosas, como si tienes un montón de variables x 1 , x 2 , ... x n , entonces una arbitraria se conocerá como x i .

En cuanto a por qué es así, imagino que SLaks es correcto y es porque soy la primera letra en Index.

zwol
fuente
93
@SLott: ¿Y por qué se iusa en matemáticas?
SLaks el
13
@Slaks: Esa es una buena pregunta. De hecho, creo que "i" podría provenir de un entero más que de un índice. También creo que es fácil escribir en una pizarra. En los años 70, se nos advirtió que nos aseguráramos de escribir nuestra "i" y "j" de una manera perfectamente distintiva. De hecho, se nos dijo que dibujáramos nuestra "i" exactamente como una "j" al revés para ser perfectamente claros al respecto.
S.Lott
26
@ S.Lott: Dudo que provenga de un número entero. Usamos ℤ (pizarra en negrita Z) para los enteros porque significa la palabra alemana Zahlen , que significa números . Suponiendo que la notación de suma surgió aproximadamente al mismo tiempo, se esperaría la notación basada en alemán, y la palabra alemana para índice es Índice , que también comienza con una i . Y no puedo pensar en muchas letras que son particularmente difíciles de escribir en una pizarra. Bueno, excepto ξ :-)
Antal Spector-Zabusky
14
"Esta convención existe porque ha existido antes". Así es como funciona la etimología: nadie sabe por qué un ruido particular tenía un significado particular en PIE. Sería bueno explicar la convención matemática, pero la pregunta es "por qué se usan como contadores en las estructuras de control", por lo que hasta que alguien produzca una respuesta que vaya más allá, esta es la mejor. Al menos especula por qué se usa en matemáticas. Un historiador matemático adecuado podría averiguarlo, tal vez utilizando un corte binario. Euclides no lo usó, apuesto a que von Neumann lo hizo. ¿Qué tal Cauchy? Él usaba mucho los índices
Steve Jessop el
14
Creo que fue Lagrange quien recomendó usar a, b, c para las constantes de una función y x, y, z para las variables de una función. i, j, k denotan las 'direcciones' de un vector, y los factores de una suma formal como esta pueden interpretarse como grados de libertad [direcciones, con otro nombre] de la ecuación.
David
200

Creo que se remonta a Fortran. Las variables que comienzan con I a Q eran enteras por defecto, las otras eran reales. Esto significaba que Iera la primera variable entera, y Jla segunda, etc., por lo que cayeron hacia el uso en bucles.

Ignacio Vazquez-Abrams
fuente
53
Creo que esto proviene de la forma en que a los matemáticos parece gustarles usar i, j, k como subíndices útiles para la suma y los índices de multiplicación de matrices y demás. Recuerdo haber leído en un manual temprano de Fortran II algo sobre eso. (Sí, Fortran II.)
S.Lott
55
Sí, FORTRAN origina estas convenciones.
Jé Queue
9
Me enseñaron a Itravés de Nno Q. Google parece estar de acuerdo en su mayoría. (diferentes versiones de FORTRAN?)
Hugh Allen
2
Y todo lo demás en Fortran era, por defecto, real. Lo que lleva a la broma "Dios es real, a menos que sea declarado entero".
Lagerbaer
44
@learnvst - porque los matemáticos habían estado usando i, j durante al menos un siglo antes.
Martin Beckett
195

Los matemáticos usaban i, j, k para designar enteros en álgebra (subíndices, series, sumas, etc.) mucho antes (por ejemplo, 1836 o 1816 ) existían computadoras (este es el origen de los valores predeterminados de tipo variable de 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 René 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.

Timday
fuente
17
Para mí, esta es claramente la mejor respuesta. (Mención de honor por la respuesta de Michael Borgwardt, que también cita la convención matemática pero no es tan específica). Lamento que la suya no sea la aceptada. Todo lo que puedo hacer es darle mi voto positivo.
John Y
3
Esta es exactamente la razón por la que necesitamos poder votar por una respuesta aceptada por la comunidad (y sí, sé que esto pertenece a uservoice).
Kredns
Je Ocasionalmente actualizo el enlace a un viejo libro de Google en esta respuesta porque Google sigue cortando cosas. Por casualidad, observo que el documento de 1816 ahora vinculado incluye a Charles Babbage (presumiblemente el de motor de diferencia / fama de motor analítico) como autor. Así que podría decirse que es un ejemplo del primer uso de una variable entera "i" por un programador informático: ^)
timday
..OK el enlace de 1816 no va a la página con "i", pero están ahí.
Timday 01 de
129

i = entero

Viene de Fortran, donde las variables enteras tenían que comenzar con las letras I a N y las variables reales comenzaron con las otras letras. Por lo tanto, 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 lenguajes.

EDITAR : No tengo ningún problema con la respuesta que deriva de las matemáticas. Sin duda, ahí es donde los diseñadores de Fortran se inspiraron. El hecho es que, de todos modos, cuando comencé a programar en Fortran usamos I, J, K, ... para contadores de bucles porque eran cortos y los primeros nombres de variables permitidos legalmente para enteros. Como estudiante de segundo año en HS probablemente había oído hablar de Descartes (y muy pocos otros), pero hice muy poca conexión con las matemáticas al programar. De hecho, el primer curso que tomé se llamó "Fortran for Business" y no fue impartido por la facultad de matemáticas, sino por la facultad de negocios / economía.

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 Fortran que llevaba a otros idiomas.

revs tvanfosson
fuente
44
Estoy bastante seguro de que fue FORTRAN.
Cade Roux
44
Ya, fortran ..... pudre la mente. Tenemos un programador que usa i ii y iii como nombres de variables de bucle. El otro síntoma es la variable de 6 caracteres / nombres de funciones sin vocales.
EvilTeach
44
@tvan, estoy bastante seguro de que las variables que comienzan con I a N están predeterminadas a entero, pero aún así podría declararlas reales, por lo tanto, la broma "Dios es real, a menos que se declare entero". +1 de todos modos, ya que mi recuerdo de hace tantos años posiblemente NO sea perfecto.
paxdiablo
10
¡Hola, los chicos de FORTRAN se lo quitaron a los matemáticos!
Lunes
66
Estoy de acuerdo con @timday. El uso de i como índice de una serie ha sido una práctica de matemáticos durante al menos 2 siglos.
Scottie T
91

isignifica I ndex.
jque viene después i.

SLaks
fuente
12
Creo que estaba hablando del alfabeto, trata de usar un poco de imaginación :)
Jack
33
@Jack: Creo que @Pete estaba bromeando ;-)
Chris Pfohl
13
@Cpfohl: sí, solo quería ser aburrido: D
Jack el
44
@Pete Kirkham: Muchas gracias Pete, fue la mejor risa que tuve en el último mes.
Amissico
@SLaks ... Creo que su derecho lo hace i = Índice que proviene de la notación de índice utilizada en matemáticas en.wikipedia.org/wiki/Index_notation o aquí hay una buena referencia physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
John Hartsock
63

Estos símbolos se usaron como índices de matriz en matemáticas mucho antes de que se inventaran las computadoras electrónicas.

erickson
fuente
52

Creo que probablemente se deriva del índice (en el sentido matemático ): se usa comúnmente como un índice en sumas u otras operaciones basadas en conjuntos, y lo más probable es que se haya usado de esa manera desde antes de que existieran lenguajes de programación.

Michael Borgwardt
fuente
Buena respuesta. Esto (para mí) de hecho parece ser la explicación más probable.
Noldorin
3
Sip. La notación matemática para una suma como Y = Σ Xiprecede a cada lenguaje de programación.
Treb
Estoy pensando en el índice cada vez que lo uso i. Pero originalmente lo uso principalmente porque todo el código que veo en otro lugar lo usa, y eso puede ser heredado de los programadores de Fortran ...
asombro
47

Hay una preferencia en matemáticas por 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 segundo para dimensiones. "p, q, r" también se usan a menudo para funciones.

Luego hay otras restricciones en las secuencias disponibles: "l" y "o" se evitan, porque se parecen demasiado 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 no deja muchas brechas de tres letras consecutivas sin asociaciones no deseadas en matemáticas para los índices.

Entonces, como varios 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.

Charles Stewart
fuente
2
Convenido. Aunque, a, b, ces una secuencia bastante comúnmente usada pesar de atener múltiples significados ...
Stobor
32

Encontré otra posible respuesta que podría ser que yo, jyk provienen Hamilton's Quaternions.

texto alternativo

Euler escogió i para 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 eran 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 coincidente. El cálculo vectorial reemplazó el análisis cuaterniónico en la década de 1890 porque era una mejor manera de escribir las ecuaciones de Maxwell. Pero la gente tendía a escribir cantidades vectoriales como esta: en (3i-2j+k) lugar de (3,-2,1) . Entonces (ijk) se convirtió en los vectores 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. Entonces (ijk) comenzó a connotar "vectores que se intercambian por grupos de permutación", luego se dirigió hacia "cosas similares a índices que toman todos los valores posibles en un conjunto específico", que es básicamente lo que significan en un bucle for.

Carlos
fuente
11
por fin un enfoque diferente a la pregunta, punto interesante +1
Fabian
30

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
Hernán Eche
fuente
3
Veo n como number, por lo general, el número de elementos en un conjunto.
Tom Leys
66
Oh hombres, ¿y qué XXX parece ser? )) +1 para la creatividad;)
Hovhannes Grigoryan
A veces me alegro de que la mayoría de las veces no tengo que molestarme con el tipo de mnemotécnicos que otras personas se les ocurren por cosas así ...
Thies Heidecke
21

Una tarde soleada, Arquímedes reflexionó ( como era habitual en las tardes soleadas ) y se encontró con su amigo Eratóstenes.

Arquímedes dijo: "¡Saludo 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 pasando un tiempo terrible haciendo un seguimiento de cuántas iteraciones he hecho "

Eratóstenes dijo: "¡Por qué Arquímedes, que eres un ciruelo maduro, simplemente puedes marcar sucesivas filas de líneas en la arena, cada una de las cuales realiza un seguimiento del número de iteraciones que has hecho dentro de la iteración!"

Arquímedes gritó al mundo que su gran amigo era sin lugar a dudas un brillante rayo de inteligencia por 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, existía el riesgo de perder la noción de qué fila estaba arriba y cuál abajo.

"¡Quizás debería marcar estas filas con una letra del alfabeto a un lado para que siempre sepa qué fila es cuál! ¿Qué piensas de eso?" preguntó, luego agregó: "Pero Eratóstenes ... ¿qué letras debo usar?"

Eratóstenes estaba seguro de que no sabía qué letras serían las mejores, y se lo dijo a Arquímedes. Pero Arquímedes no estaba satisfecho y siguió presionando al pobre bibliotecario para que eligiera, al menos, las dos letras que necesitaría para su solución de equilibrio de esfera actual.

Eratóstenes, finalmente cansado de la solicitud incesante de dos cartas, gritó: "¡¡¡NO LO SABO !!!"

Entonces Arquímedes eligió las dos primeras letras de la oración exclamativa de Eratóstenes, y agradeció a su amigo por la contribución.


Estos símbolos fueron adoptados rápidamente por los antiguos desarrolladores griegos de Java, y el resto es, bueno ... historia.

Brendan
fuente
66
... y tenía la carta j.
Andrew Grimm
Wow, eso casi se lee como una tortuga y la historia de Aquiles del GEB de Hofstadter
ProfK
15

Creo que es porque muchos bucles usan una variable de tipo Int para hacer el conteo, como

for (int i = 0; etc

y cuando escribes, en realidad lo dices en tu cabeza (como cuando lees), así que en tu mente dices 'int ...'

y cuando tiene que inventar una letra justo después de ese 'int ...', dice / escribe la 'i' porque esa es la primera letra en la que piensa cuando acaba de decir 'int'

como deletrear una palabra a los niños que comienzan a aprender a leerle deletrear palabras usando nombres, como este:

WORD deletrea 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 lo sigue justo después.

Michel
fuente
77
ies anterior a esta sintaxis.
SLaks
1
Esa es una excelente manera de confundir a un niño; ¿Realmente enseñas a los tuyos a deletrear así?
Carreras de ligereza en órbita
14

Creo que es una combinación de las otras razones mencionadas:

Para empezar, los matemáticos usaban comúnmente 'i' en su notación, y en los primeros días de la computación con lenguajes que no eran binarios (es decir, debían analizarse y expresarse 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 usó en lenguajes de computadora para programar bucles, y desde entonces se ha quedado algo así.

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.

Alex Marshall
fuente
13

¿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, ¿continúa la convención?

p.ej:

do 100 i = j, 100,5 .... 100 continuar ....

Brett
fuente
FWIW, generalmente me salteo la letra l porque se parece demasiado al número 1.
Nosredna
13

i = iterador, i = índice, i = entero

Cualquiera que sea su figura, "i" significa que todavía "se ajusta a la ley".

Además, a menos que tenga una sola línea de código dentro de ese ciclo, probablemente debería nombrar la variable iterador / índice / entero a algo más significativo. Me gusta: employeeIndex

Por cierto, generalmente uso "i" en mis simples iteradores de bucles; a menos, por supuesto, que contenga varias líneas de código.

Chris Pietschmann
fuente
13

i = iota, j = jot; Ambos pequeños cambios.

iota es la letra más pequeña del alfabeto griego; en el idioma inglés su significado está vinculado a pequeños cambios, como en "ni una pizca" (de una frase en el Nuevo Testamento: "hasta que el cielo y la tierra pasen, ni una pizca, ni un punto, pasará 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.

cf. http://en.wikipedia.org/wiki/Iota

Stephen
fuente
13

Bien de 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: derivada
e: el número de Euler
f, g, h: las funciones
i, j, k: son índices (también vectores unitarios y los cuaterniones)
l: Generalmente no se utiliza. se ve como 1
m, n: son filas y columnas de matrices o como números enteros para números racionales
o: también no se usa (a menos que tenga poca notación o)
p, q: a menudo se usa como primos
r: a veces un cambio espacial de variable otras veces relacionadas 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

MaDMaD Mad
fuente
11

Muchas posibles razones principales, supongo:

  • los matemáticos usan iy jpara los números naturales en las fórmulas (las que usan números complejos rara vez, al menos), por lo que esto se trasladó a la programación
  • de C , iinsinúa a int. Y si necesita otro int, i2es demasiado tiempo, por lo que decide usarlo j.
  • hay idiomas donde la primera letra decide el tipo, y iluego es un integer.
Towi
fuente
10

Proviene de Fortran, donde i, j, k, l, m, n son implícitamente enteros.

Walter Bright
fuente
7

Definitivamente proviene de las matemáticas, que precedieron a la programación de computadoras.

Entonces, ¿de dónde vino si en matemáticas? Mi conjetura sin educación es que, como dijo un compañero, a los matemáticos les gusta usar grupos 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 agota las posibilidades. ¿Por qué no m, n? Bueno, se usan para enteros, pero más a menudo los puntos finales de iteraciones en lugar de las variables iterativas en sí.

Alguien debería preguntarle a un historiador de las matemáticas.

David Lewis
fuente
6

Los contadores son muy comunes en los programas, y en los primeros días de la informática, todo era importante ... Los
programadores naturalmente intentaron conservar píxeles, y la 'i' requería menos píxeles que cualquier otra letra para representar. (Los matemáticos, siendo flojos, lo eligieron por la misma razón, como el glifo más pequeño).
Como se dijo anteriormente, 'j' simplemente siguió naturalmente ...

:)

Gerrat
fuente
24
En los primeros días de la informática, los píxeles no existían .
SLaks
1
@Slaks, ese es un comentario ganador. Solo veo la sonrisa en mi cara al leerlo, y los votos. ¡Agradable!
ProfK
"Los programadores naturalmente intentaron conservar píxeles, y la 'i' requirió menos píxeles que cualquier otra letra para representar". <<< eso es gracioso.
ocodo
1
... y así nació la optimización prematura!
Gerrat
4

Lo uso por varias razones.

  • Por lo general, mis bucles están basados ​​en int, por lo que haces un triángulo completo en el teclado escribiendo "int i" con la excepción del espacio que manejo con el pulgar. Esta es una secuencia muy rápida para escribir.

  • La "i" podría significar iterador, entero, incremento o índice, cada uno de los cuales tiene sentido lógico.

Con mis usos personales a un lado, la teoría de que se deriva de FORTRAN es correcta, donde los números enteros usan las letras I - N.

John T
fuente
4

Aprendí FORTRAN en Control Data Corp. 3100 en 1965. Las variables que comienzan con 'I' hasta 'N' implicaban ser enteros. Por ejemplo: 'IGGY' y 'NORB' eran enteros, 'XMAX' y 'ALPHA' eran de coma flotante. Sin embargo, puede anular esto mediante una declaración explícita.

Pierre
fuente