create a variable number of loop

L

Li Chen

Hi all,

I want to create a variable number of loop based on the input:
if the input is 1, I will create a loop ( I call it 1-loop);
if the input is 2 , I will create a nested loop( 2-loop);
if the input is 3, I will create a loop of loop of loop (3-loop);
if the input is 4, I will create a 4-loop, so on and so on.
How I can do that?

Thanks,

Li

array=%W{A B C D}

#input is 1

array.each do |e1|
puts e1
end


#input is 2
array.each do |e1|
array.each do |e|2
puts e1+e2
end
end

#input is 4
array.each do |e1|
array.each do |e2|
array.each do |e3|
array.each do |e4|
puts e1+e2+e3+e4
end
end
end
end
 
J

James Coglan

[Note: parts of this message were removed to make it a legal post.]

2009/7/21 Li Chen said:
Hi all,

I want to create a variable number of loop based on the input:
if the input is 1, I will create a loop ( I call it 1-loop);
if the input is 2 , I will create a nested loop( 2-loop);
if the input is 3, I will create a loop of loop of loop (3-loop);
if the input is 4, I will create a 4-loop, so on and so on.
How I can do that?


Would this input be the size of the array you're looping over? Seems from
your example that you're trying to sum all the combinations of values in the
array. If so there's probably a clean recursive way to do this.
 
J

James Coglan

[Note: parts of this message were removed to make it a legal post.]

2009/7/21 Li Chen said:
Hi all,

I want to create a variable number of loop based on the input:
if the input is 1, I will create a loop ( I call it 1-loop);
if the input is 2 , I will create a nested loop( 2-loop);
if the input is 3, I will create a loop of loop of loop (3-loop);
if the input is 4, I will create a 4-loop, so on and so on.
How I can do that?

Thanks,

Li

array=%W{A B C D}

#input is 1

array.each do |e1|
puts e1
end


#input is 2
array.each do |e1|
array.each do |e|2
puts e1+e2
end
end

#input is 4
array.each do |e1|
array.each do |e2|
array.each do |e3|
array.each do |e4|
puts e1+e2+e3+e4
end
end
end
end



You can do this recursively by decrementing a depth count until you hit the
bottom, at which point to print the data you want:

def print_sums(array, depth, memo = 0)
array.each do |x|
if depth == 1
puts memo + x
else
print_sums(array, depth - 1, memo + x)
end
end
end

data = %W{A B C D}
print_sums(data, 1)
print_sums(data, 2)
print_sums(data, 3)
print_sums(data, 4)
 
L

Li Chen

You can do this recursively by decrementing a depth count until you hit
the
bottom, at which point to print the data you want:

Hi James,

Thank you very much for the codes. It solves part of my problem. I try
to follow your idea and
implement the reamining part. But I don't think I can. Here is the
whole story:

What I really try to do is to create a word of using letters of
'A,B,C,D'' only with different size
(1-letter, 2-letter,3-letter, ..., up to 25-letter word).
For each word created I count the value for each individual letter and
get the sum for the word.

And here are the rules:
A=0; B=1;C=2;D=3
for a word of 1 letter its value is:

'A'=>0; 'B'=>1;''C'=>2; ''D'=>3;

for 'A', it has 0*(4**0) if it appears on 0th, 0*(4**1) if on 10th,
0*(4**2) if on 100th, so on and so on
for 'B', it has 1*(4**0) if it appears on 0th, 1*(4**1) if on 10th,
1*(4**2) if on 100th, so on and so on
similar to 'C' and 'D'

so the following word of 'ABCD' has a value: 0*(4**3)+ 1*(4**2)+
2**(4**1)+3*(4**0)
'DDDD' has a value:3*(4**3)+ 3*(4**2)+ 3**(4**1)+3*(4**0)


Li
 
S

steve

Li said:
Hi James,

Thank you very much for the codes. It solves part of my problem. I try
to follow your idea and
implement the reamining part. But I don't think I can. Here is the
whole story:

What I really try to do is to create a word of using letters of
'A,B,C,D'' only with different size
(1-letter, 2-letter,3-letter, ..., up to 25-letter word).
For each word created I count the value for each individual letter and
get the sum for the word.

And here are the rules:
A=0; B=1;C=2;D=3
for a word of 1 letter its value is:

'A'=>0; 'B'=>1;''C'=>2; ''D'=>3;

for 'A', it has 0*(4**0) if it appears on 0th, 0*(4**1) if on 10th,
0*(4**2) if on 100th, so on and so on
for 'B', it has 1*(4**0) if it appears on 0th, 1*(4**1) if on 10th,
1*(4**2) if on 100th, so on and so on
similar to 'C' and 'D'

so the following word of 'ABCD' has a value: 0*(4**3)+ 1*(4**2)+
2**(4**1)+3*(4**0)
'DDDD' has a value:3*(4**3)+ 3*(4**2)+ 3**(4**1)+3*(4**0)


Li

C:\Documents and Settings\Administrator>irb
irb(main):001:0> "DDDD".tr("DCBA","3210").to_i(4)
=> 255
irb(main):002:0>
 
L

Li Chen

steve said:
C:\Documents and Settings\Administrator>irb
irb(main):001:0> "DDDD".tr("DCBA","3210").to_i(4)
=> 255
irb(main):002:0>

Steve,

Thank you so much. It is so neat!

Li
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top