Re: Problem with the 'if' command

*To*: mathgroup at smc.vnet.net*Subject*: [mg96617] Re: Problem with the 'if' command*From*: "Nasser Abbasi" <nma at 12000.org>*Date*: Tue, 17 Feb 2009 06:27:04 -0500 (EST)*References*: <gncme2$fid$1@smc.vnet.net>*Reply-to*: "Nasser Abbasi" <nma at 12000.org>

"mathandpi" <mathandpi at yahoo.com> wrote in message news:gncme2$fid$1 at smc.vnet.net... > Hi everyone, > I'm a new Mathematica user so I may be missing something fairly obvious, > but I'm having trouble with the 'if' command. > I'm writing a function that is supposed to return the median of a list (I > know such a function already exists, but I need to create one myself). > > What I have is: > > newMedian[list_] := > If[Length[list]/2 == 0, > 1/2*(list[[(Length[list]/2) + 1]] + list[[(Length[list])/2]]) > , list[[(Length[list] + 1)/2]]] > > if the list has an off number of members (condition is false), it > evaluates as expected. If it's even, however, > > newMedian[{1, 2, 3, 4}] returns: > Part::pspec: Part specification 5/2 is neither an integer nor a list of > integers. > > BUT > > list={1,2,3,4}; > > 1/2*(list[[(Length[list]/2) + 1]] + list[[(Length[list])/2]]) > returns 5/2, as expected so that code is right. > > It seems likes its actually evaluating the false part of the code (trying > to find the 5/2'ith element in a list), even though the condition is true. > > What's going on here? > > Thanks > Your check for even is wrong. You were actually hitting the else part. Better to use EvenQ newMedian[list_] := Module[{len = Length[list]}, If[ EvenQ[len], (1/2)*(list[[len/2 + 1]] +list[[len/2]]), list[[(len + 1)/2]] ] ] newMedian[{1, 2, 3, 4}] 5/2 --Nasser