Понятно, что вызывать ее стоит retsum(n,n,0), а не только 8,8,0
Помню когда-то в незапамятные времена на форуме проскользнула фраза: "Блин, начинаю хххх уподобляться, сперва пишу нерабочий код, а потом выпускаю к нему патчи" :D
А про препода не удивляйся - разве это их основная работа - олимпиадные задачи решать? Моя учительница все время меня на уроке втихаря спрашивала, правильно ли она операторы написала ))
Был бы презнателен, если бы ты еще объяснил что делает и что значит функции "IIf" и "CStr". Или вообще пояснил каждую строчку для понятия. Ну если нет, так нет. Я и так тебе благодарен.
Iif - аналог тринарного оператора в C. Синтаксис: Iif(cond,expr1,expr2) - возвращает expr1, если cond=TRUE, и expr2, если FALSE. CStr - конвертирует число в строку. Как решается:
Так как нужны все суммы, надо рекурсивно вычитать и числа последовательно все числа от N до 1 до тех пор, пока не станет равно 0. Так же для каждой разности. В a() сохраняются слагаемые, в l - уровень вложения рекурсии и, соответственно, число слагаемых. Так как повторы не нужны, результат должен быть отсортирован, для этого сделаем так, чтобы из числа нельзя было вычесть большее число, чем вычиталось на предыдущем шаге рекурсии - передаем прошлое число. Как видим, для вычитания перебираются все числа от минимального из n и m - это делается для того, чтобы не вычесть из n число, большее его самого, но и не большее m, до 1. Вот так все и работает. Вообще же это быстроразветвляющаяся рекурсия, поэтому при росте N ресурсоемкость будет сильно возрастать. Можно рассчитать верхнюю оценку этого числа - предположим, что все слагаемые - единицы, тогда потребуется N вложений, каждое из которых будет содержать где-то N разветвлений. Итого N^N... Но это, имхо, уж очень пессимистичная оценка. Хотя для 8 - в пределах разумного