I’m trying to print every combination of three characters from the
range (a…z). I thought recursion would be the most elegant solution,
but that got me quite confused Any suggestions? Here’s my
(erronous) attempt:
def addChar(str, level)
(‘a’…‘z’).each {|c|
if level == 2
puts str + c
else
str += c
addChar(str, level + 1)
end
}
end
Thoug ‘aaa’…‘zzz’ is certainly the most elegeant, maybe it would help
if you’d try to understand this recursion
def combinations(elements, length)
return [] if length == 0
return elements if length == 1
result = []
elements.each do | element |
combinations(elements, length - 1).each do | combination |
result << element + combination
end
end
result
end
What you want
puts combinations((‘a’…‘c’).to_a, 3)
Using the power of ducktyping
combinations([[1], [2], [3]], 3).each do | combination |
p combination
end
What does this calculate?
combinations((1…3).to_a, 3).each do | combination |
p combination
end
Thanks! That is certaily a elegant solution, but I wonder what the
logic behind it is. I can’t find any documentation on this usage of
ranges, any pointers?
I’m trying to print every combination of three characters from the
range (a…z). I thought recursion would be the most elegant solution,
but that got me quite confused Any suggestions?
Definitely not recursion. Consider that your problem is equivalent to
printing every possible 3 digit number in base 26
Not that you can’t do it recursively:
def f(lhs)
if lhs.length == 3
puts lhs
else
for c in ‘a’…‘z’
f(lhs + c)
end
end
end
Thanks! That is certaily a elegant solution, but I wonder what the
logic behind it is. I can’t find any documentation on this usage of
ranges, any pointers?
Here’s how you get there:
(‘aaa’…‘zzz’).to_a is clearly a call to Range#to_a.
ri Range tells you that Range gets #to_a from Enumerable.
ri Enumerable#to_a tells you that it returns the elements yielded by
a call to #each. (Oh wait, it doesn’t. It should… . Really,
it’s no secret that all of Enumerable’s methods are defined in terms
of #each, but I can’t find it anywhere in the rdoc comments.)
ri Range#each tells you that the elements yielded come from
successive calls to each element’s #succ method, starting with the
start object (‘aaa’ in this case).
ri String#succ tells you that ‘aaa’.succ will return ‘aab’ (and so
on).
I’m trying to print every combination of three characters from the
range (a…z). I thought recursion would be the most elegant solution,
but that got me quite confused Any suggestions?
Definitely not recursion. Consider that your problem is equivalent
to printing every possible 3 digit number in base 26