Suma digital, Python

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:

  • obtener el primer (o último) dígito
  • formatea el rest como un número más corto
  • sume el dígito y la sum digital del número más corto (¡recursión!)

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:

  1. Puedes definir funciones internas en Python
  2. Puede utilizar el operador de módulo (buscar su syntax y uso) para un buen efecto, aquí
  3. No hay necesidad de construir una representación de lista explícita con una solución recursiva adecuada

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.