Hello Ronald, 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.
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. 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). So, in a way it is true that you are making it repeat a loop but it is more semantically precise than that. 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. I hope that helps. Joshua Ewulo On 6 June 2012 11:17, Ronald Reynolds <[email protected]> wrote: > Is it correct to say that when I call a function inside of it's own > definition I am just making it repeat loop? > (define<http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))> > (my-map f lst) > (cond<http://docs.racket-lang.org/reference/if.html#(form._((lib._racket/private/letstx-scheme..rkt)._cond))> > > [(empty?<http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._empty~3f))> > lst) > empty<http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._empty))> > ] > [else<http://docs.racket-lang.org/reference/if.html#(form._((lib._racket/private/letstx-scheme..rkt)._else))> > > (cons<http://docs.racket-lang.org/reference/pairs.html#(def._((quote._~23~25kernel)._cons))> > (f > (first<http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._first))> > lst)) (my-map f > (rest<http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._rest))> > lst)))])) > Is this code telling racket to repeat until lst is empty? Thx to all for > your help. > > ------------------------------ > *From:* Stephen Bloch <[email protected]> > *To:* Ronald Reynolds <[email protected]> > *Cc:* racket list <[email protected]> > *Sent:* Tuesday, June 5, 2012 5:57 AM > *Subject:* Re: [racket] recursion?? > > > On Jun 5, 2012, at 7:37 AM, Ronald Reynolds wrote: > > I hope I'm not too much of a 'pain in the neck noobie' but what is the > short clean answer about what's going on when we > name a function as part of the definition of itself.. This seems pretty > esoteric to me. What does the system do? > > > By "what's going on", are you talking about how it's implemented inside > the computer, or how people use this technique to solve problems? > > For the former, you would need to know something about memory > organization, machine or assembly language, stacks, etc. > > For the latter, let's try this analogy. I'm a custodian, assigned to > clean each of the rooms on a long hallway. But I'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 "the rest of the rooms", but > realizes that he's already at the end of the hallway, so he can report that > he'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. > > 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: "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." Since they all follow > the same rule, it only needs to be written once. > Another name for "rule" is "program" or "function"; 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. > > Now, what would happen if the custodians were even lazier? When I'm > assigned to clean all the rooms on this hallway, I IMMEDIATELY tell my > assistant to do the job (the WHOLE job, not "the rest"). 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. > > 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. > > > Stephen Bloch > [email protected] > > > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > >
____________________ Racket Users list: http://lists.racket-lang.org/users

