sums acumulativas recursivas

Necesito escribir un progtwig que calcule sums acumulativas de una lista de números con def pero SOLAMENTE con recursión. Lo hice, pero ahora necesito escribir el mismo progtwig sin usar la sum del método, pero hasta ahora no he tenido éxito. ¿Alguna idea?

mi código:

 def rec_cumsum(numbers): ''' Input: numbers - a list of numbers, Output: a list of cumulative sums of the numbers''' if len(numbers)==0: return numbers return rec_cumsum(numbers[:-1])+ [sum(numbers)] 

entrada:

1 [1,2,3]

2 [2, 2, 2, 3]

salida:

1 [1,3,6]

2 [2, 4, 6, 9]


mi código sin sum :

 def rec_cumsum(numbers): ''' Input: numbers - a list of numbers, Output: a list of cumulative sums of the numbers''' if len(numbers) == 0: return numbers my_list=[] rec_cumsum(my_list + numbers) my_list[0]=numbers[0] rec_cumsum(my_list) temp_sum=my_list[0]+numbers[-1] my_list[0]=temp_sum return my_list 

Lo que puedes hacer es: –

  • Crea una lista temporal (una vacía).
  • Pase su lista original y la lista vacía en su método.
  • Ahora, cuando pase su lista por primera vez, solo agregue el primer elemento de su lista original. Y llama al mismo método con el rest de la lista. A partir del 1er elemento.
  • Cuando se invoca su método después de las salas, debe tomar una sum del last elemento de su temp list y del first element de la lista original que ahora está modificado. Y agrega la sum a tu lista temporal como nuevo elemento.
  • Finalmente, cuando la longitud de su lista original sea 0. Devuelva su temp.

** Aquí está el código para los pasos anteriores. Puede compararlo con el que ha implementado y ver dónde se equivocó:

 def rec_cumsum(numbers): if len(numbers) == 0 : return temp # You need to check, if `temp` is empty, that means method is called first time. if not temp: temp.extend([numbers[0]]) // Just add the first element to it. else: # Else, get the last element from `temp`, # add it to `first elemt` in `numbers` and add it to `temp`. temp.extend([temp[-1] + numbers[0]]) return rec_cumsum(numbers[1:]) my_list = [2, 2, 2, 3] temp = [] print rec_cumsum(my_list) 

Sugeriría algo como esto sin agregar argumentos adicionales:

[ACTUALIZADO]

 def rec(n): if len(n) < 2: return n n[1] = n[0] + n[1] return [n[0]] + rec(n[1:]) print rec([1,2,3,4]) [1, 3, 6, 10] 

Otra solución más sería:

 def rec(n): if len(n) < 2: return n rest = rec(n[:-1]) return rest + [rest[-1] + n[-1]] 

este se siente mas intuitivo para mi ..