Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Getting stuck with finding an elegant solution without global variables

  • To: mathgroup at smc.vnet.net
  • Subject: [mg124821] Re: Getting stuck with finding an elegant solution without global variables
  • From: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>
  • Date: Wed, 8 Feb 2012 05:31:10 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

On Tue, 07 Feb 2012 09:08:28 -0000, Fredob <fredrik.doberl at gmail.com>  
wrote:

> Hi,
>
> I am trying to find an elegant solution, i.e. without a global
> variable to the following problem:
>
> Given a list, e.g. {1,2,3,4}, create a new list where each element is
> a function of the "i th" element and the rest of the list, e.g.
>
> Branch[Elem_, List_] := Elem + Cases[List, Except[Elem]]
>
> The the result would be {{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}
>
> I have used Map[f, List] but then I have to use a global variable in f
> to access the list itself, e.g. BranchG[Elem_] := Elem + Cases[List,
> Except[Elem]]
>

It seems to me that you are asking not for elegant solutions per se, but  
rather for solutions in a pure functional style. As such I assume that it  
is not so much global variables that you wish to avoid using as any  
user-defined named symbols (variables) at all. Actually, the clearest way  
to accomplish this (in my opinion) is indeed to use Map:

Function[{f, lst},
  Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst]
][Plus, {1, 2, 3, 4}]

{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

Obviously other functions can be used as well, such as Times:

Function[{f, lst},
  Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst]
][Times, {1, 2, 3, 4}]

{{2, 3, 4}, {2, 6, 8}, {3, 6, 12}, {4, 8, 12}}

Or we can return a closure over the list, leaving f unspecified until  
later:

In :=
Function[lst,
  Function[f,
   Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst] // Evaluate
  ]
][{1, 2, 3, 4}]

Out =
Function[f$,
  {f$[1, {2, 3, 4}], f$[2, {1, 3, 4}],
   f$[3, {1, 2, 4}], f$[4, {1, 2, 3}]}
]

In :=
%[Plus]

Out =
{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

And just for fun here is one without Map:

Function[{f, lst},
  Range@Length[lst] // Function[idx,
   Through[f[Part, Delete][lst, idx]],
   Listable
  ]
][Plus, {1, 2, 3, 4}]

{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

Although it is not so important here as we have not employed any  
user-defined symbols in the above, I would caution you against using  
symbol names starting with capital letters. Especially names like List,  
which are already in use for fundamental Mathematica language constructs.



  • Prev by Date: Re: Input cells destroy Grids?
  • Next by Date: Dancing "a la Levenberg-Marquardt" to get the best Logistic Model.
  • Previous by thread: Re: Getting stuck with finding an elegant solution without global variables
  • Next by thread: Re: Getting stuck with finding an elegant solution without global variables