Вот что-то в Groovy, вы должны быть в состоянии понять, что происходит. Это не самый эффективный код, и он не создает ответы в том порядке, в котором вы цитируете свой вопрос (хотя, похоже, вам не хватает некоторых), но это может дать вам начало.
def f(a,b) {
for (i in a..b) {
for (j in 1..i/2) {
def (sum, str, k) = [ 0, "", j ]
while (sum < i) {
sum += k
str += "+$k"
k++
}
if (sum == i) println "$i=${str[1..-1]}"
}
}
}
Выход для f(3,21)
:
3=1+2
5=2+3
6=1+2+3
7=3+4
9=2+3+4
9=4+5
10=1+2+3+4
11=5+6
12=3+4+5
13=6+7
14=2+3+4+5
15=1+2+3+4+5
15=4+5+6
15=7+8
17=8+9
18=3+4+5+6
18=5+6+7
19=9+10
20=2+3+4+5+6
21=1+2+3+4+5+6
21=6+7+8
21=10+11
Надеюсь, это поможет. Это как бы соответствует принципу простейшего действия, которое могло бы сработать.