Necesito una función que tome n y devuelva 2 n - 1 . Suena bastante simple, pero la función tiene que ser recursiva. Hasta ahora solo tengo 2 n :
def required_steps(n):
if n == 0:
return 1
return 2 * req_steps(n-1)
El ejercicio dice: "Se puede suponer que el parámetro n es siempre un número entero positivo y mayor que 0"
1 << n
lo que no pueden desbordarse. Esto parece ser un ejercicio para inventar una forma de descomponerse(1<<n) - 1
en múltiples pasos, quizás estableciendo cada bit uno a la vez, como muestran algunas respuestas.def fn(n): if n == 0: return 1; return (2 << n) - fn(0); # technically recursive
C:\MyFolder
Respuestas:
2**n -1
también es 1 + 2 + 4 + ... + 2 n-1 que puede convertirse en una única función recursiva (sin la segunda para restar 1 de la potencia de 2).Sugerencia : 1 + 2 * (1 + 2 * (...))
Solución a continuación, no busque si desea probar la pista primero.
Esto funciona si
n
se garantiza que es mayor que cero (como se prometió en la declaración del problema):Una versión más robusta también manejaría valores cero y negativos:
(Agregar un cheque para los no enteros se deja como ejercicio).
fuente
required_steps(0)
ahora causa una recursión infinita2^0 - 1
== 0. Agregue otroif
para ese caso.int
, no sabemos qué hacer cuando n <0. ¿Calcular? ¿Lanzar un error? ¿Devolver 0? En este caso, solo podemos hacer una función parcial (definirla para cosas que sabemos cuál es el resultado).0
y se utilizan - 1
para el subproblema. Un dominio de números naturales parece un buen ajuste.Para resolver un problema con un enfoque recursivo, tendría que averiguar cómo puede definir la función con una entrada dada en términos de la misma función con una entrada diferente. En este caso, desde entonces
f(n) = 2 * f(n - 1) + 1
, puedes hacer:así que eso:
salidas:
fuente
Puedes extraer la parte realmente recursiva a otra función
O puede establecer una bandera y definir cuándo sustraer
fuente
Usando un parámetro adicional para el resultado,
r
-También puede escribirlo usando el desplazamiento a la izquierda a nivel de bit,
<<
-La salida es la misma
fuente
else
cláusula en ninguna de las funcionesr * 2
ar << 1
y que es "no se puede leer en absoluto"? 😂n
veces y luego le resta 1. parece aún menos elegante a continuación, es necesario, a pesar de todo el asunto es un ejercicio de comparación ineficiencia(1<<n) - 1
.Tenga un marcador de posición para recordar el valor original de n y luego para el primer paso
n == N
, es decir , regresar2^n-1
fuente
Una forma de obtener el desplazamiento de "-1" es aplicarlo en el retorno de la primera llamada de función utilizando un argumento con un valor predeterminado, luego establecer explícitamente el argumento de desplazamiento en cero durante las llamadas recursivas.
fuente
Además de todas las increíbles respuestas dadas anteriormente, a continuación se mostrará su implementación con funciones internas.
Básicamente, está asignando un valor global de n a k y recurriendo a través de él con las comparaciones apropiadas.
fuente