Hello Ronald,<div><br></div><div>Function calling is the semantically the same no matter what function you call. When you call a function you set up an environment/stack for the function to operate in.</div><div><br></div>
<div>Now when a function is recursive it create a new environment/stack and calls a function just like itself (with equivalent operational functionality) on the new environment/stack.</div><div><br></div><div>You could however simulate the contents of the new environment/stack using a single environment/stack by keeping track of the changing state explicitly in your code (i.e change the value of the current environment/stack within a loop say).</div>
<div><br></div><div>So, in a way it is true that you are making it repeat a loop but it is more semantically precise than that.</div><div><br></div><div>In some cases the recursive call makes the meaning/behaviour of the function clearer (eg: insertion-sort, quick-sort, merge-sort, tree traversals e.t.c). Try taking a look at implementations of the above that are not recursive and you will see what I mean.</div>
<div><br></div><div>I hope that helps.</div><div><br></div><div>Joshua Ewulo</div><div><br><div class="gmail_quote">On 6 June 2012 11:17, Ronald Reynolds <span dir="ltr">&lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:times new roman,new york,times,serif"><div><span>Is it correct to say that when I call a function inside of it&#39;s own definition I am just making it repeat loop?  </span></div>
<div><table cellspacing="0" style="font-family:serif"><tbody><tr><td style="padding-left:0px;padding-right:0px"><table cellspacing="0" style="white-space:inherit;text-align:left"><tbody><tr style="white-space:inherit"><td style="padding-left:0px;padding-right:0px;vertical-align:baseline;white-space:inherit">
<span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))" style="text-decoration:none;color:black" target="_blank">define</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">my-map</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">f</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">lst</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span></td>
</tr><tr style="white-space:inherit"><td style="padding-left:0px;padding-right:0px;vertical-align:baseline;white-space:inherit"><span style="font-family:monospace">  </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/if.html#(form._((lib._racket/private/letstx-scheme..rkt)._cond))" style="text-decoration:none;color:black" target="_blank">cond</a></span></td>
</tr><tr style="white-space:inherit"><td style="padding-left:0px;padding-right:0px;vertical-align:baseline;white-space:inherit"><span style="font-family:monospace">   </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">[</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._empty~3f))" style="text-decoration:none" target="_blank">empty?</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">lst</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._empty))" style="text-decoration:none" target="_blank">empty</a></span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">]</span></td>
</tr><tr style="white-space:inherit"><td style="padding-left:0px;padding-right:0px;vertical-align:baseline;white-space:inherit"><span style="font-family:monospace">   </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">[</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/if.html#(form._((lib._racket/private/letstx-scheme..rkt)._else))" style="text-decoration:none;color:black" target="_blank">else</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/pairs.html#(def._((quote._~23~25kernel)._cons))" style="text-decoration:none" target="_blank">cons</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">f</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._first))" style="text-decoration:none" target="_blank">first</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">lst</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span></td>
</tr><tr style="white-space:inherit"><td style="padding-left:0px;padding-right:0px;vertical-align:baseline;white-space:inherit"><span style="font-family:monospace">               </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">my-map</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">f</span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">(</span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)"><a href="http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._rest))" style="text-decoration:none" target="_blank">rest</a></span><span style="font-family:monospace"> </span><span style="font-family:monospace;white-space:inherit;color:rgb(38,38,128)">lst</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">]</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span><span style="font-family:monospace;white-space:inherit;color:rgb(132,60,36)">)</span></td>
</tr></tbody></table></td></tr><tr><td style="padding-left:0px;padding-right:0px"><div> Is this code telling racket to repeat until lst is empty?  Thx to all for your help. </div></td></tr></tbody></table></div><div><br></div>
  <div style="font-family:&#39;times new roman&#39;,&#39;new york&#39;,times,serif;font-size:12pt"> <div style="font-family:&#39;times new roman&#39;,&#39;new york&#39;,times,serif;font-size:12pt"> <div dir="ltr"> <font face="Arial"> <hr size="1">
  <b><span style="font-weight:bold">From:</span></b> Stephen Bloch
 &lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt;<br> <b><span style="font-weight:bold">To:</span></b> Ronald Reynolds &lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt; <br>
<b><span style="font-weight:bold">Cc:</span></b> racket list &lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt; <br> <b><span style="font-weight:bold">Sent:</span></b> Tuesday, June 5, 2012 5:57 AM<br>
 <b><span style="font-weight:bold">Subject:</span></b> Re: [racket] recursion??<br> </font> </div> <br>
<div><div><br><div><div>On Jun 5, 2012, at 7:37 AM, Ronald Reynolds wrote:</div><br><blockquote type="cite"><div><div style="font-size:12pt;font-family:times,serif"><div>I hope I&#39;m not too much of a &#39;pain in the neck noobie&#39; but what is the short clean answer about what&#39;s going on when we</div>
<div>name a function as part of the definition of itself..  This seems pretty esoteric to me.  What does the system do?  </div></div></div></blockquote></div><br><div>By &quot;what&#39;s going on&quot;, are you talking about how it&#39;s implemented inside the computer, or how people use this technique to solve problems?</div>
<div><br></div><div>For the former, you would need to know something about memory organization, machine or assembly language, stacks,
 etc.</div><div><br></div><div>For the latter, let&#39;s try this analogy.  I&#39;m a custodian, assigned to clean each of the rooms on a long hallway.  But I&#39;m lazy, so after cleaning one room I tell my assistant to clean the rest.  My assistant is lazy too, so after cleaning one room he tells HIS assistant to clean the rest.  That second assistant is equally lazy, so after cleaning one room she tells HER assistant to clean the rest.  And so on down the hallway.  Eventually my 27th sub-assistant is assigned to clean &quot;the rest of the rooms&quot;, but realizes that he&#39;s already at the end of the hallway, so he can report that he&#39;s finished without cleaning anything at all.  His boss reports having accomplished the task she was assigned, as does her boss, and his boss, and his boss, and so on, until word gets back to me that my assistant has accomplished what I told him to do, at which point I announce that I, too, have accomplished
 what I was told to do.</div><div><br></div><div>Now suppose all of these custodians are not just equally lazy, but are actually clones of one another, or are a bunch of identical robots, or something like that.  Every one of them follows the exact same rule: &quot;If there are rooms left to clean, clean one of them and tell my assistant to do the rest.  If not, declare success and go home.&quot;  Since they all follow the same rule, it only needs to be written once.</div>
<div>Another name for &quot;rule&quot; is &quot;program&quot; or &quot;function&quot;; you can think of the computer as creating a whole bunch of assistants, each one giving the next one an assignment and waiting for him/her to finish.</div>
<div><br></div><div>Now, what would happen if the custodians were even lazier?  When I&#39;m assigned to clean all the rooms on this hallway, I IMMEDIATELY tell my assistant to do the job (the WHOLE job, not &quot;the rest&quot;).  My assistant, being equally lazy, immediately
 tells his assistant to do the job, and so on: soon an infinite number of assistants are telling one another what to do, with nobody ever actually picking up a broom.  This is the most common mistake people make in writing recursive programs: they call the same function to solve THE SAME PROBLEM rather than to solve A SMALLER PROBLEM.</div>
<div><br></div><div>It could be even worse: suppose, after being assigned to clean all the rooms on the hallway, I pick a clean room and hold a drunken party in it, then assign my assistant to clean this room as well as all the rooms I was assigned.  My assistant does the same, and rather than having fewer and fewer rooms left to clean, we have more and more.  In other words, the function calls itself to solve A LARGER PROBLEM than it itself was given.</div>
<br><br><div>
<span style="text-indent:0px;letter-spacing:normal;font-variant:normal;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:Helvetica;word-spacing:0px"><span style="text-indent:0px;letter-spacing:normal;font-variant:normal;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:Helvetica;word-spacing:0px"><div style="word-wrap:break-word">
<div>Stephen Bloch</div><div><a rel="nofollow" href="mailto:[email protected]" target="_blank">[email protected]</a></div></div></span></span>
</div>
<br></div></div><br><br> </div> </div>  </div></div><br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>