Re: functional code
- To: mathgroup at smc.vnet.net
- Subject: [mg4791] Re: [mg4779] functional code
- From: Allan Hayes <hay at haystack>
- Date: Mon, 16 Sep 1996 23:51:19 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Richard Gaylord<gaylord at ux1.cso.uiuc.edu>
[mg4779] functional code
In response to request for functional code to solve the following
>>Given a list of numbers row={18,19,1,11,25,12,22,14}
>>Select the numbers from the list by taking the largest number
>>from the ends of the list until the list is empty.
>
>Nest[
>Function[y,
>({Join[y[[1]],{#}] , DeleteCases[y[[2]], #]})&[Max[First[y[[2]]],
>Last[y[[2]]]]]], {{}, row}, Length[row]][[1]]
Richard,
(1)
There is a problem if there are repeated entries in row.
row = {1,1};
Nest[
Function[y,
({Join[y[[1]],{#}] , DeleteCases[y[[2]], #]})&[Max[First[y[[2]]],
Last[y[[2]]]]]], {{}, row}, Length[row]][[1]]
First::first: {} has a length of zero and no first element.
Last::nolast: {} has a length of zero and no last element.
{1, Max[First[{}], Last[{}]]}
(2)
Table gives a fast solution:
row = Table[Random[],{500}];
(res1 =
Block[{f=1, l = Length[row]},
Table[If[row[[f]]>row[[l]], row[[f++]], row[[l--]]],{n,l}]
]
);//Timing
{0.5 Second, Null}
Compared to your,
(res2=
Nest[
Function[y,
({Join[y[[1]],{#}],DeleteCases[y[[2]], #]})&[
Max[First[y[[2]]],Last[y[[2]]]]
]
],
{{}, row},
Length[row]
][[1]]
);//Timing
{9.5 Second, Null}
res1 == res2
True
Allan Hayes,
hay at haystack.demon.co.uk
==== [MESSAGE SEPARATOR] ====