 # Adding selected elements in an array using Recursion

I want to achieve the below via recursion:
[1,2,3,4,5]

first iteration => 1 + 2
second iteration => 1+ 3
third iteration => 1+4
fourth iteration =>1+5
fifth iteration => 1+2+3
sixth iteration => 1+2+4
seventh iteration =>1+2+5
eigth iteration => 1+2+3+4
ninth iteration => 1+2+3+5

but I do not know if there is a good way provided in Ruby to do this. Kindly assist please.

Hi there. You can do this:
#!/usr/bin/ruby -w

``````ary = [1, 2, 3, 4, 5]
sz = ary.size - 1

sz.-(1).times do |i|
(i + 1..sz).each { |j| puts ary[0..i].<<(ary[j]).then { |v| "#{v.join(' + ')} = #{v.sum}" } }
end
``````

Output:

``````1 + 2 = 3
1 + 3 = 4
1 + 4 = 5
1 + 5 = 6
1 + 2 + 3 = 6
1 + 2 + 4 = 7
1 + 2 + 5 = 8
1 + 2 + 3 + 4 = 10
1 + 2 + 3 + 5 = 11
``````

I am not sure what you want to do with the strings like this. If you want the arrays itself:

``````# Added 6:
ary = [1, 2, 3, 4, 5, 6]
sz = ary.size - 1

p (0..sz.-(2)).map { |i| (i + 1..sz).map { |j| ary[0..i].<<(ary[j]) } }
``````

Output:

``````[[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 3, 6]], [[1, 2, 3, 4, 5], [1, 2, 3, 4, 6]]]
``````
2 Likes

thanks so much! I actually need the second part(not the string version). I want to add the numbers in that format and test if it is equal to another number. I was looking at implementing the second part using recursion.

1 Like

Try this:

``````arr = [1,2,3,4,5]
``````
``````first, *rest = arr
(1..arr.size-1).flat_map { |n| rest.combination(n).to_a }.
map { |a| a.unshift(first) }
#=> [[1, 2], [1, 3], [1, 4], [1, 5],
#    [1, 2, 3], [1, 2, 4], [1, 2, 5],
#      [1, 3, 4], [1, 3, 5],
#      [1, 4, 5],
#    [1, 2, 3, 4], [1, 2, 3, 5],
#      [1, 2, 4, 5],
#      [1, 3, 4, 5],
#    [1, 2, 3, 4, 5]]
``````

Notice that the desired result is asymmetric in the sense that all digits other than the first (`1`) are incremented. Forgetting about the `1`'s it is seen that what is wanted follows a familiar pattern.

The title asks for a solution that uses recursion. This one does not. Yes, recursion could be used, but why restrict solutions to the use of a particular technique? This is an example of what is sometimes called an X-Y problem. If you specifically want a recursive solution let me know and I’ll post one.

1 Like

@SouravGoswami, nice solution. It’s curious how you do chaining. I’ve not seen that before.

1 Like

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.