¿Cuál es la estrategia de divide y vencerás? Escribe un algoritmo para encontrar x a la enésima potencia usando el método de dividir y conquistar.

Si desea resolver un problema difícil, la estrategia de dividir y conquistar significa que lo divide en pequeños problemas más fáciles de resolver y utiliza esos algoritmos para resolver su problema difícil.

Solución 1

Digamos que quieres resolver [matemáticas] x ^ n [/ matemáticas]. En aras de mantenerlo simple, supongamos que n es un número entero. n podría ser positivo o negativo, así que dividamos nuestro problema en 2 problemas, uno para valores positivos y otro para valores negativos

potencia de def (x, n):
si n> = 0:
retorno positivo Potencia (x, n)
más:
retorno negativo Potencia (x, n)

Allí, dimos el primer paso en nuestra estrategia de divide y vencerás. Ahora tenemos 2 problemas más simples para resolver. Vamos a centrarnos en el problema de la energía positiva primero.

¿Cómo resolvemos [matemáticas] x ^ n [/ matemáticas] para positivo [matemáticas] n [/ matemáticas]? si [matemáticas] n = 0 [/ matemáticas], entonces el resultado es 1, de lo contrario podemos dividir más. Vamos a resolver el problema más simple de [matemáticas] x ^ {n-1} [/ matemáticas]. entonces todo lo que tenemos que hacer es multiplicarlo por x. Podemos escribir eso así:

def positivo Potencia (x, n):
si n == 0:
volver 1
más
retorno positivo Potencia (x, n-1) * x

Todavía estamos por resolver el poder negativo, sabemos que

[matemáticas] x ^ {- n} = \ frac {1} {x ^ n} [/ matemáticas]

resolver [matemáticas] x ^ n [/ matemáticas] es un problema más simple que ya hemos resuelto, así que:

def negativo Potencia (x, n):
return 1 / positivePower (x, -n)

Solución 2

La primera solución es fácil de entender, pero no la más eficiente.

Una propiedad interesante es que [math] x ^ n = x ^ {n / 2} \ times x ^ {n / 2} [/ math]. Podemos dividir esto en problemas más fáciles si consideramos el caso donde n es impar yn es incluso por separado:

[matemáticas] x ^ n = \ begin {cases} x ^ {n / 2} \ times x ^ {n / 2} & \ text {si n es par} \\ x ^ {floor (n / 2)} \ veces x ^ {floor (n / 2)} \ veces x & \ text {si n es impar} \ end {cases} [/ math]

resolver [matemáticas] x ^ {n / 2} [/ matemáticas] es mucho más fácil que resolver [matemáticas] x ^ n [/ matemáticas], así que una vez más estamos usando la estrategia de dividir y conquistar. El algoritmo para potencias positivas es:

def positivo Potencia (x, n):
si n == 0:
volver 1
tmp = positivePower (x, n // 2)

si n% 2 == 0:
volver tmp * tmp
más
volver tmp * tmp * x

More Interesting

¿Hay alguna relación de recurrencia famosa aparte de Fibonacci?

¿Cuáles son los mejores algoritmos de clasificación para DBMS?

Puedo pensar en algoritmos en varias preguntas, pero cuando realmente escribo un código me enfrento a muchas dificultades. Entonces, siento que soy pobre escribiendo códigos. ¿Cómo puedo mejorar eso?

¿Qué tan buena es la calidad de los problemas de HackerRank en comparación con los problemas de Topcoder, Codeforces, Codechef?

Cómo realizar una operación de revolución usando un treap

¿Qué método es el más adecuado para resolver problemas de programación de enfermería, programación dinámica o algoritmos genéticos, y por qué?

¿Cuál es el mejor curso de análisis de datos y algoritmos presentado con el lenguaje Python?

¿Qué algoritmos puedo usar para predecir la temperatura o dichos parámetros en función de sus datos históricos?

¿Hay algún algoritmo de clasificación que sea sustancialmente más rápido que QuickSort?

Cómo resolver este problema de matrices en programación en C

¿Se puede usar el algoritmo de Prim para encontrar la ruta más corta desde un vértice a todos los demás vértices en un gráfico no dirigido?

Cómo demostrar que O (f (n) - g (n)) no es necesariamente igual a O (f (n)) - O (g (n))

¿Cuál es la diferencia entre un algoritmo y una fórmula?

¿Cómo saben los codificadores cómo codificar e implementar un algoritmo instintivamente?

¿Cuál es el algoritmo más fácil para encontrar el camino más corto en un robot seguidor de línea para un principiante?