Python, 52 байта
f=lambda l,n:n*l and f(f(l[:-1],1)+[sum(l)],n-1)or l
Рекурсивная функция, которая повторяется как по списку, так lи по количеству итераций n. Давайте разберемся с этим.
Во-первых, давайте рассмотрим рекурсивную функцию, gкоторая повторяла частичную сумму только один раз.
g=lambda l:l and g(l[:-1])+[sum(l)]
Для пустого списка lэто возвращает lсебя, пустой список. В противном случае последняя запись частичных сумм lявляется общей суммой l, которая добавляется к рекурсивному результату для всех, кроме последнего элементаl .
Теперь давайте посмотрим на функцию, fкоторая применяется gдля nитераций.
f=lambda l,n:n and f(g(l),n-1)or l
Когда nесть 0, это возвращает список lбез изменений, и в противном случае, применяется gодин раз, затем вызываетf рекурсивно с оставшимся меньшим количеством итераций.
Теперь давайте снова посмотрим на реальный код, который объединяет две рекурсии в одну функцию. Идея состоит в том, чтобы рассматривать g(l)как особый случай f(l,1).
f=lambda l,n:n*l and f(f(l[:-1],1)+[sum(l)],n-1)or l
Мы взяли f(g(l),n-1)из предыдущего определения, расширяется g(l)в g(l[:-1])+[sum(l)], а затем заменить g(_)с f(_,1)на приурочены рекурсивные вызовы вf .
Для базового случая мы хотим вернуться lвсякий раз, когда n==0или l==[]. Мы объединяем их, отмечая, что любой из них n*lявляется пустым списком, то есть ложью. Итак, мы возвращаемся, когда n*lне пусто, и возвращаемl противном случае.
Даже если есть два рекурсивных вызова f, это не вызывает экспоненциального увеличения рекурсивного определения чисел Фибоначчи, но остается квадратичным.