<div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">黃耀賢 (Yau-Hsien Huang)</b> <span dir="ltr"><<a href="http://g9414002.pccu.edu.tw">g9414002.pccu.edu.tw</a>@<a href="http://gmail.com">gmail.com</a>></span><br>
Date: 2011/7/18<br>Subject: Re: [erlang-questions] On Loop<br>To: Jesper Louis Andersen <<a href="mailto:jesper.louis.andersen@gmail.com">jesper.louis.andersen@gmail.com</a>><br><br><br><div class="im"><div class="gmail_quote">
2011/7/18 Jesper Louis Andersen <span dir="ltr"><<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>> And, in my imagination, all data in Erlang is put in stack. So, when<br>
> I use 81 cells, they occupy memory with 81 units, right?<br>
<br>
</div>Not if the tail-call-optimization trigger! Then it is 1 unit, and the<br>
function uses as much memory as the C++ module a constant factor. And<br>
I dare say it does in your case.<br>
<br>
A more erlang-idiomatic way of encoding your problem is the following:<br>
<br>
[io:format("~B x ~B = ~B~n", [I, J, I*J])<br>
    || I <- lists:seq(2,10), J <- lists:seq(2,10)].<br>
<br>
Here is the basic idea:<br>
<br>
1. Create the list [2,3,...,9] = lists:seq(2,9) two times.<br>
2. Use a List Comprehension. Iterate through the elements [2,3,...,9]<br>
and call it I. The semantics of list comprehensions are that for each<br>
of these, the list comprehension will carry out its second part which<br>
is to iterate J through [2,3,...,9]. In other words, we create the<br>
cartesian product of [2,...9] X [2,...,9].<br>
3. For each {I, J} pair, call io:format/2 on the result.<br>
<br>
It is succinct, but it does create the lists first though. So it does<br>
uses some more memory.<br>
<br>
<br>
--<br>
<font color="#888888">J.<br>
</font></blockquote></div><div><br></div></div><div>Yes, and my question is: did I save memory by using nested loop?</div><div><br></div><div>By using for/4, it may be a</div><div>    for(1, fun fp/1, fun fi/1, fun fc/1)</div>

<div>where fp/1 is</div><div>    fp(I) -> I =< 81.</div><div><br></div><div>When it's nested loop,</div><div>    main() -> for(1, fun fp/1, fun fi/1, fun fc/1).</div><div>    fp(I) -> I =< 9.</div><div>

    ...</div><div>    fc(I) -> for (1, fun fp/1, fun fi/1, fc1(I)).</div><div>    fc1(I) -> fun(J) -> io:format("~w x ~w = ~w~n", [I, J, I*J]) end.</div><div><br></div><div>Did I save memory when main/0 only run a function doing recursion</div>

<div>9 times, while in each time recursion it wakes up another function,</div><div>fc/1, recurring 9 times?</div><div><br></div><div>Following the consideration, can we say, "keep your Erlang program</div><div>flat," that is, when executing there're not many too deep recursion</div>

<div>and it's worth memory-restrict machines?</div><div><br></div><font color="#888888">-- <br></font><div><div></div><div class="h5"><div><br></div>Best Regards.<div><br></div><div>--- Y-H. H.</div><div><br></div><br>

</div></div></div><br><br clear="all"><br>-- <br><div><br></div>Best Regards.<div><br></div><div>--- Y-H. H.</div><div><br></div><br>