Special thanks!
- To: mathgroup at smc.vnet.net
- Subject: [mg23240] Special thanks!
- From: Jack Goldberg <jackgold at math.lsa.umich.edu>
- Date: Sat, 29 Apr 2000 22:04:48 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Group! I am indebted to David Parks, Carl Woll, Wijnand Schepens and Preston Nichols for their clear and thoughtful responses to my post, wherein I asked for an explanation of this simple (?) code: OrderedUnion2[li_] := Module[ {i}, i[n_] := ( i[n] = Null; n ); i /@ li ] I know that there were others besides myself who were puzzled by line 2, the definition of i[n_]. I now understand my confusion and in the hope that this helps others, I offer it here. An expression such as fnt[x_] := (expr1; expr2; expr3); when CALLED evaluates each expression inside the () but returns only expr3. In our case, what is returned is n, the argument of i[n]. Once i[n_] is called say with n = 2.3 then i[2.3] = Null is constructed AND 2.3 is returned. When (and if) i[2.3] is encountered again, Mathematica searches its definition list (the downvalues for i and finds i[2.3]=Null before it finds i[n_] := (.....) because i[2.3] is more specific than the general formula for i[n_]. So the second line of the code will not "fire" when the argument of i is 2.3 except (as noted) the first time 2.3 is seen. For example, OrderedList2[{1,1,1,1,1,1}] calls line 2 only once, the first time it sees i[1]. The last 5 times it sees i[1] it uses the definition i[1]=Null which it constructed BUT DID NOT return the first time and only time i[n_] in line 2 is called. !! In other words i[1] = Null in line 2 is NOT called ever again!! At the risk of "beating a dead horse", here is a modification of Woll/Parks code that convinced me. test[li_] := Block[ {i, j=0}, i[n_] :=(i[n]=Null; j=j+1); i/@li ] This modification enables us to counts the number of times i[n_] is called. We can see that i[n_] is called only once for the list {1,1,1,1,1,1,1} but 6 times for the list {3,2,99,8,3,1}. If this explanation is wrong then I really don't know whats going on :-) Jack