       Re: Recursion

• To: mathgroup at smc.vnet.net
• Subject: [mg25946] Re: [mg25925] Recursion
• From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
• Date: Fri, 10 Nov 2000 02:40:22 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Here is a complicated but single line recursive function that almost

f2 = Function[l, If[Length[l] == 1, {{}, l}, Function[ Which[#2 == {}, #1,
#1 == {}, #2, True, Prepend[#0[Rest[#1], #2], First[#1]]]][f2[Rest[l]],
Function[ If[#2 == {}, {}, Prepend[#0[#1, Rest[#2]], #1[First[#2]]]]][
Function[Append[#, First[l]]], f2[Rest[l]]]]]]

For example:

In:=
f2[{a, b, c}]

Out=
{{}, {c}, {b}, {c, b}, {a}, {c, a}, {b, a}, {c, b, a}}

What actually happens is that the functions Join and Map are defined
recursively as anonymous functions inside the code. So this is just my
pervious solution re-written to suit your requirements.
Unfortunately there is one snag. The function makes use of Mathematica's
unique (I think!) construction involving #0. It seems to me that you are
writing programs in Scheme or a similar Lisp based language and none of them
have anything similar.
There may well be a much simpler one line functional recursive solution
(without using auxiliary functions -- the problem becomes easy if you use
them) but I can't think of one.

--
Andrzej Kozlowski
Toyama International University
JAPAN

http://platon.c.u-tokyo.ac.jp/andrzej/
http://sigma.tuins.ac.jp/

on 00.11.9 9:19 PM, Carlos Baeta Silva at carlos.silva at tcontas.pt wrote:

> Andrzej Kozlowski, thanks for your help, but I forgot to tell that we only
> can use the functions: First, Last, Rest, {}, ==, !=,[[]],Append,
> Prepend,Take e Drop.
>
> In the first question I define f in this terms:
>
> f = Function[p,
> If[p=={},
> {{},{}},
> If[Last[First[p]]<9.5,
> Prepend[f[Rest[p]],First[p]],
> Append[f[Rest[p]],First[p]]
> ]
> ]
> ]
>
> In the second question I have no idea, Can you help me Andrzej?
>
> Thanks a lot!
>
> -----Mensagem original-----
> De: Andrzej Kozlowski [mailto:andrzej at tuins.ac.jp]
> Enviada: quinta-feira, 9 de Novembro de 2000 12:01
> Para: Carlos Baeta Silva; mathgroup at smc.vnet.net
> Assunto: Re: [mg25925] Recursion
>
>
> Here are a couple of quick attempts (programmed without concern for
> efficiency):
>
>
> In:=
> f1[{}] := {{}, {}}; f1[{x_}] := If[Last[x] < 9.5, {{x}, {}}, {{}, {x}}];
> f1[{l__, x_}] :=
> If[Last[x] < 9.5, Insert[f1[{l}], x, {1, -1}], Insert[f1[{l}], x, {2,
> -1}]]
>
> In:=
> f1[{{"poiu", 12}, {"asdfghjkl", 5}, {"qwerty", 18}, {"zxcvbnm", 8}}]
>
> Out=
> {{{"asdfghjkl", 5}, {"zxcvbnm", 8}}, {{"poiu", 12}, {"qwerty", 18}}}
>
> In:=
> f2[{}] := {{}}; f2[{a_}] := {{a}, {}};
> f2[{a_, l__}] := Sort[Join[f2[{l}], Map[Append[#, a] &, f2[{l}]]]]
>
> In:=
> f2[{1, 2, 3}]
>
> Out=
> {{}, {1}, {2}, {3}, {2, 1}, {3, 1}, {3, 2}, {3, 2, 1}}
>
> In the case of the second function the sorting  is not the same as in your
> message but I assumed that that was not important for you. One can fix this
> of course but it will make the code even more inefficient.

```

• Prev by Date: Re: Bug: Mathematica 4.0 vs. Win2k on ThinkPad
• Next by Date: Re: How can I combinate two strings into one?
• Previous by thread: Re: Recursion
• Next by thread: Re: Recursion