Necesito escribir un código que cuente la sum de los dígitos de un número, este es el texto exacto del problema: La sum digital de un número n es la sum de sus dígitos. Escriba una función recursiva digitalSum (n) que tome un entero positivo n y devuelva su sum digital. Por ejemplo, digitalSum (2019) debería devolver 12 porque 2 + 0 + 1 + 9 = 12. Este es el código que escribí:
def digitalSum(n): L=[] if n < 10: return n else: S=str(n) for i in S: L.append(int(i)) return sum(L)
Este código funciona bien, pero no es una función recursiva, y no se me permite cambiar ningún int a str. ¿Me podría ayudar?
Prueba esto:
def digitalSum(n): if n < 10 : return n return n % 10 + digitalSum( n // 10 )
Edición: la lógica detrás de este algoritmo es que para cada llamada de la función recursiva, cortamos el último dígito del número y lo summos a la sum. Primero obtenemos el último dígito con n % 10
y luego volvemos a llamar a la función, pasando el número con el último dígito truncado: n // 10
. Solo paramos cuando alcanzamos un número de un dígito. Una vez que paramos, la sum de los dígitos se calcula en orden inverso, a medida que regresan las llamadas recursivas.
Ejemplo para el número 12345:
5 + digitalSum( 1234 ) 5 + 4 + digitalSum( 123 ) 5 + 4 + 3 + digitalSum( 12 ) 5 + 4 + 3 + 2 + 1 <- done recursing 5 + 4 + 3 + 3 5 + 4 + 6 5 + 10 15
Es tarea, así que no estoy escribiendo mucho código. La recursión se puede utilizar de la siguiente manera:
Esta es más una pregunta relacionada con los algoritmos.
Aquí está tu respuesta:
def digit_sum(a): if a == 0: return 0 return a % 10 + digit_sum(a/10)
Déjame saber si no entiendes por qué funciona y te daré una explicación.
Algunos consejos:
EDITAR Lo anterior es un poco “malo” como respuesta general, ¿qué sucede si alguien más tiene este problema en un contexto que no es la tarea? Entonces el desbordamiento de stack falla …
Entonces, así es como lo implementaría, y usted debe decidir si debe continuar leyendo o no. 🙂
def digitalSum(n): def process(n, sum): if n < 10: return sum + n return process(n / 10, sum + n % 10) return process(n, 0)
Esto puede ser demasiado, pero incluso en una situación de aprendizaje, tener acceso a una respuesta puede ser instructivo.
Mi solución es más detallada que algunas, pero también es más amigable para un comstackdor optimizador de llamadas , que creo que es una característica.
def digital_sum(number): if number < 10: return number else: return number % 10 + digital_sum(number / 10)
def sumofdigits(a): a = str(a) a = list(a) b = [] for i in a: b.append(int(i)) b = sum(b) if b > 9: return sumofdigits(b) else: return b print sumofdigits(5487123456789087654)
Aún así, puede hacerlo en O (log10 n) … cancele todos los dígitos que se sumn a 9 y luego, si no quedan números, 9 es la respuesta; de lo contrario, sume todos los dígitos que faltan …
def rec_sum_Reduce(n) : ans = 0 for i in map(int,str(n)) : ans = 1+(ans+i-1)%9 return ans
def drs_f (p):
drs = sum([int (q) for q in str(p)]) while drs >= 10: drs = sum([int(q) for q in str(drs)]) return drs
def digitalSum(n): if n < 10: return n else: return ???
La primera parte es de su código existente. Los ??? Es la parte que necesitas hacer. Podría tomar un dígito de n
y agregarlo a la sum digital de los dígitos restantes.
Realmente no necesitas el else
, pero lo dejé allí para que la estructura del código se vea igual.