Según Knuth, un algoritmo puede tener cero o más entradas. ¿Alguien puede darme un ejemplo de un algoritmo sin entrada?

Como parte de su definición de algoritmo, en el primer capítulo del primer volumen de The Art of Computer Programming, Knuth dice que un algoritmo tiene cero o más entradas. Creo que lo hizo desde el punto de vista de la corrección, a pesar de que (creo) no ve ningún valor real o interés en un algoritmo de entrada cero. No puedo pensar en un solo ejemplo de los volúmenes. Si bien esa podría ser mi memoria defectuosa, las restricciones que agrega a la definición estándar de un algoritmo de computadora, restricciones que insisten en que un algoritmo sea lo más simple y práctico posible, dificultan la creación de un algoritmo útil de entrada cero en sus términos

Antes de intentar dar ejemplos de algoritmos sin entrada, voy a mirar las definiciones y restricciones de Knuth y explicar por qué limitan nuestras opciones.

¿Qué son las entradas de un algoritmo?

Del libro mismo: “cantidades que se le dan inicialmente antes de que comience el algoritmo, o dinámicamente a medida que el algoritmo se ejecuta”

Cualquier valor no especificado en uno de los pasos del algoritmo, no generado automáticamente durante el cálculo pero requerido para completar el cálculo es una entrada. Independientemente de la fuente (ubicación de memoria, archivo en disco, entrada de teclado, conexión de red, reloj del sistema o algún otro dispositivo de hardware), si el valor proviene del exterior del algoritmo, entonces es una entrada.

Los algoritmos son funcionales.

“Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas”.

Por “funcional”, no me refiero a que Knuth solo codifica en Haskell. Quiero decir que define un algoritmo como algo que calcula los valores de salida en función de los valores de entrada. Escribe sus algoritmos en un código de máquina muy imperativo que inventó para una computadora imaginaria, pero sus algoritmos son funciones puras .

Los algoritmos son finitos

Para Knuth, un algoritmo solo debe tomar un número finito de pasos; se permiten números muy grandes, pero no

  • Serie de pasos potencialmente infinitos (los denomina “métodos computacionales”)
  • Procesos que interactúan continuamente (los denomina “procesos reactivos”)

La descalificación de procesos que son procesos potencialmente infinitos es controvertida pero práctica. La descalificación de los procesos reactivos es totalmente justa.

¿Qué no está permitido?

Siguiendo las restricciones dadas, los algoritmos de entrada cero no pueden ser

  • Generadores de números aleatorios. Lo sentimos, pero todos toman insumos (semillas) y algunos de ellos son procesos reactivos.
  • Generadores de secuencia infinita. Si tiene un proceso para calcular la secuencia de Fibonacci o encontrar números primos y no especifica una condición de parada finita demostrable (por ejemplo, después de generar n números o solo números más pequeños que n ), entonces es un método computacional pero no un algoritmo. Yn es una entrada.

¿Qué está permitido?

Se podría argumentar que la codificación dura de la (s) entrada (s) en un algoritmo lo convierte en entrada cero: que codificar 100 en un algoritmo para encontrar todos los primos menores que n lo convierte en un algoritmo de entrada cero para encontrar todos los primos menores que 100. Creo eso es trampa y ciertamente no es interesante, ya que significa que cualquier algoritmo también puede ser de entrada cero.

De lo contrario, la regla “no se permite el infinito” excluye muchos procesos de entrada cero potencialmente interesantes y útiles.

Los algoritmos de juego resueltos son una opción, aunque un pedante podría argumentar que un algoritmo de tic-tac-toe podría funcionar para cuadrículas de cualquier tamaño y 3 × 3 es un par de entradas.

Hay algunas cosas útiles relacionadas con interesantes secuencias de números finitos. Los números de la suerte de Euler ofrecen una forma barata de generar una lista (no exhaustiva) de números primos, por ejemplo.

Así que voy a hacer de eso mi ejemplo. El afortunado generador de números primos de Euler. Espero que le sea útil.

Depende de a qué se refiera como entrada. Algún algoritmo que simplemente genera un valor constante puede decirse que su “entrada” es el programa mismo.

Digamos que el algoritmo asigna una matriz de bytes juntos en un valor entero para verificar si el sistema es little-o big-endian. Las “entradas” (es decir, los bytes utilizados en la matriz) pueden declararse (y normalmente serían) como constantes en el código fuente. Por ejemplo, Ideone.com

¿Se clasificaría como una entrada como los valores constantes del código fuente? ¿O tal vez como entrada la codificación del sistema? Habría muy pocos programadores que estarían de acuerdo con algo así.

Luego viene la variación adicional en lo que exactamente se considera una entrada. Por ejemplo, calcular números aleatorios desde algún dispositivo de hardware, o incluso un pseudo RNG utilizando el temporizador como semilla. ¿Se considera que tales externalidades son entradas? ¿O es estrictamente una situación de algo que el usuario (humano o no) ingresa en el algoritmo. Por ejemplo, el RNG puede ser un algoritmo utilizado por otro programa; siendo ese programa el usuario no ingresa nada en el RNG. El RNG obtiene su semilla de algún otro medio.

El último punto es algo polémico, aunque depende si ve la computadora completa como parte del algoritmo y qué tan estricto es con los efectos secundarios.

Asumiendo jugadores perfectos, determine si el juego de ajedrez siempre puede ser ganado por las blancas.

Asumiendo jugadores perfectos, determine que el juego de tic-tack-toe siempre termina con un empate.

Perfecto = el jugador puede evaluar todos los movimientos desde la posición hacia abajo y decidir en consecuencia.

Técnicamente, cualquier valor codificado puede ser un algoritmo con entrada cero. Por ejemplo, genere los primeros 100 dígitos de la PI constante.

Como otros han señalado, desde una perspectiva estrictamente teórica, es mucho más fácil establecer y probar teoremas correctos sobre algoritmos si se permiten algoritmos de cero cero. Por ejemplo:

Suponga que [math] A (x_0, \ ldots, x_ {n-1}) [/ math] es cualquier algoritmo, y [math] a_i [/ ​​math] es un valor para [math] x_i [/ ​​math]. Entonces [math] A (x_0, \ ldots, x_ {i-1}, a_i, x_ {i + 1}, \ ldots, x_ {n-1}) [/ math] es un algoritmo, el curry de [math ] A [/ math] sobre [math] a_i [/ ​​math].

Ahora, sin algoritmos de cero arios, tendríamos que crear un caso especial para [math] n = 1 [/ math], que simplemente se siente mal.

Ahora, también me gustaría abordar esto desde una perspectiva práctica: como desarrollador de software de trabajo, ¡uso algoritmos (funciones) cero-ary todo el tiempo! Un gran caso de uso son las solicitudes autenticadas: en lugar de hacer que cada controlador de solicitudes haga su propia autenticación, o tener un módulo de autenticación separado que tenga que devolver el control al controlador cuando se toma su decisión de autenticación, podemos darle al autenticador un “vago”. “Respuesta en forma de un algoritmo de cero cero para ejecutar para producir una respuesta:

Autenticador de clase abstracta {
def authenticateThenEvaluate (solicitud: solicitud, businessRules: BusinessRules, lazyResponse: () => Response): Response
}

Si la solicitud no tiene suficientes privilegios para completar la solicitud de acuerdo con las reglas comerciales proporcionadas, este método devuelve una respuesta de rechazo (por ejemplo, 403 Prohibido) y el código de respuesta diferida nunca se ejecuta.

Como otros han señalado, una función que siempre devuelve un valor constante es un ejemplo de un algoritmo (degenerado) que no toma una entrada.

Un ejemplo de un algoritmo no trivial sería un generador de números aleatorios que no utiliza una “semilla”. En este caso, el algoritmo puede usar varios factores ambientales para calcular números aleatorios, pero no requiere ningún valor pasado del código usando el algoritmo.

Un algoritmo para contar a través de los enteros. Casi dije un temporizador, pero eso tomaría información del reloj del sistema, posiblemente a través de efectos secundarios. Sin entradas, el algoritmo tiene los mismos resultados cada vez.

Un generador de números pseudoaleatorios (la función rand ()).

Un algoritmo que no toma entradas y calcula 7 + 6.
Ese no es el algoritmo para tomar dos entradas A y B y calcula A + B.
Para cualquier algoritmo con n entradas, podemos definir un conjunto de algoritmos que toman cero entradas fijando las n entradas en distintos conjuntos de valores.
Todos los algoritmos (propiamente dignos del nombre) que tienen cero entradas necesariamente producen la misma salida en cada ejecución (incluyendo posiblemente no producir la salida).

Un algoritmo que genera salidas.

Por ejemplo:

  • Generar TODOS los números primos;

Rand () – generación de números aleatorios,

More Interesting

¿Cuál es la diferencia entre binary y Algoritmo?

Dado un conjunto entero tal que cada elemento ocurre 3 veces, excepto un elemento, que ocurre solo una vez, ¿cómo encuentro ese único elemento en el espacio O (1) y en la complejidad del tiempo O (n)?

F (n) E de O (g (n)) donde log (g (n))> 1 yf (n)> 1 para n grande?

¿Qué algoritmos de aprendizaje automático son más adecuados para las entradas 1-hot?

¿Cuál es la técnica de búsqueda que sigue Google?

¿Por qué mi método de generador aleatorio no funciona en Java?

¿Cuál es la técnica de clasificación eficiente para organizar los libros en una biblioteca?

¿Qué son los patrones de búsqueda?

¿Cómo es posible que algún algoritmo sea más rápido que cualquier otro algoritmo similar para algunos valores de la variable de entrada y más lento para otros valores?

¿Cómo aprenden los algoritmos de aprendizaje de refuerzo del juego de ajedrez a jugar bien, dado que cada movimiento no está etiquetado como bueno o malo, a diferencia del aprendizaje supervisado donde cada dato está etiquetado como bueno o malo?

Cómo encontrar la notación Big O del siguiente programa

¿Qué estructuras de datos usa MS Word para almacenar elementos del documento en la memoria?

Visión por computadora: las aplicaciones de Richard Szeliski ofrecen una buena (amorosa) montaña rusa a través de la historia de los algoritmos. ¿Cómo puedo usarlo mejor?

¿Por qué puede verse la secuencia de Fibonacci como un algoritmo dinámico y por qué tiene un mal tiempo de ejecución?

¿Cómo encontraron los pilotos el camino más corto, cuando volaron a larga distancia en 1950?