comp.lang.ada
 help / color / mirror / Atom feed
From: dennison@telepath.com (Ted Dennison)
Subject: Re: FAQ and string functions
Date: 5 Aug 2002 08:34:21 -0700
Date: 2002-08-05T15:34:21+00:00	[thread overview]
Message-ID: <4519e058.0208050734.30d702fe@posting.google.com> (raw)
In-Reply-To: 3D4BD17A.5000004@telepath.com

Ted Dennison <dennison@telepath.com> wrote in message news:<3D4BD17A.5000004@telepath.com>...
> There are some things you can do to help out though. For example, don't 
> declare anything locally that you don't need a separate copy of in each 
> recursive call. The same goes for passing parameters. This goes against 
> the usual rule of not using globals, but so be it. You can mitiagate the 
> maintainability pain by declaring the recursive routine inside of 
> another routine, which  contains the declarations for all the recursive 
> "globals". Also, try to code so that your algorithim is indeed 
> tail-recursive (and use the optimization).

Just to give an example, following is a rewrite of the algorithim I
gave in this post -
http://groups.google.com/groups?q=g:thl3084553553d&dq=&lr=&ie=UTF-8&selm=4519e058.0208020559.63f58040%40posting.google.com

earlier in this thread, but transformed a bit to not pass unneeded
data and to be (hopefully) tail-recursive. Again, this is uncompiled
and untested, so treat with a grain of salt.

-----------------------------------------------------------------------
-- Return a transformation of the Source string in such a way that all
-- (non-overlapping) occurances of From_Pattern are replaced by 
-- To_Pattern
function Transform (Source       : String; 
                    From_Pattern : String; 
                    To_Pattern   : String) return String is

   ------------------------------------------------------------------
   -- Return a string which is So_Far, with a transformation of Rest
   -- (based on the From_Pattern and To_Pattern) appended to it
   ------------------------------------------------------------------
   Transform_Rest (So_Far : String;
                   Rest   : String) return String is

      -- Find the location of the source pattern
      Pattern_Start : constant Natural := 
         Ada.Strings.Fixed.Index (Source  => Rest, 
                                  Pattern => From_Pattern);
   begin
      if Pattern_Start = 0 then
         return So_Far & Rest;
      else  
         -- Append the stuff before the From_Pattern, along with the
         -- To_Pattern, onto our So_Far transformed string, then have
         -- Transform_Rest transform the rest of it.
         return 
            Transform_Rest
              (So_Far => So_Far & 
                         Rest (Rest'First..Pattern_Start - 1) & 
                         To_Pattern,
               Rest   => Rest (Pattern_Start + From_Pattern'length ..
                               Rest'last)
              );
      end if;
   end Transform_Rest;
begin
   return Transform_Rest 
            (So_Far => "",
             Rest   => Source
            );
end Transform;

Note the following:

  1) We are no longer putting identical copies of the source and
target pattern on the stack with each recursive call. They are instead
global to Transform_Rest (but local to Transform). You'd be suprised
how much this can save you.

  2) We now accumulate the result string as we go, rather than tack it
onto the end of the return string.

  3) Because of 2, the recursive call no longer has any work to do
after it makes its own recursive call, other than return the result.
Therefore it is now tail-recursive.



  reply	other threads:[~2002-08-05 15:34 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-30  6:32 FAQ and string functions Oleg Goodyckov
2002-07-30  8:52 ` Colin Paul Gloster
2002-07-30 13:48 ` Ted Dennison
2002-07-31  4:52   ` Brian May
2002-08-01 16:09     ` Ted Dennison
2002-08-02  0:21       ` Brian May
2002-08-02  1:56         ` tmoran
2002-08-02 13:59         ` Ted Dennison
2002-07-31  7:46   ` Oleg Goodyckov
2002-07-31  9:04     ` Lutz Donnerhacke
2002-07-31  9:39       ` Pascal Obry
2002-07-31 15:06         ` Oleg Goodyckov
2002-07-31 16:50       ` Oleg Goodyckov
2002-07-31 20:16     ` Simon Wright
2002-07-31 20:56       ` Robert A Duff
2002-08-01  0:11         ` Darren New
2002-08-01  1:08           ` tmoran
2002-08-01  9:25           ` Brian May
2002-08-01 11:20           ` Oleg Goodyckov
2002-08-01 15:43             ` Darren New
2002-08-01 21:37               ` Robert A Duff
2002-08-03  0:42                 ` Ted Dennison
2002-08-03 13:51                   ` Robert A Duff
2002-08-03 16:43                   ` Darren New
2002-08-05 13:37                   ` Stephen Leake
2002-08-02  8:01               ` Oleg Goodyckov
2002-08-02 16:09                 ` Darren New
2002-08-01 11:09         ` Oleg Goodyckov
2002-08-01 14:08           ` Frank J. Lhota
2002-08-01 15:06             ` Robert A Duff
2002-08-01 16:05             ` Oleg Goodyckov
2002-08-01 14:57         ` Georg Bauhaus
2002-07-31 22:04     ` Dmitry A.Kazakov
2002-07-31 15:23       ` Oleg Goodyckov
2002-08-01 21:57         ` Dmitry A.Kazakov
2002-08-01 13:10           ` Oleg Goodyckov
2002-08-02 23:29             ` Dmitry A.Kazakov
2002-08-02 16:35               ` Oleg Goodyckov
2002-08-05 11:50                 ` Dmitry A. Kazakov
2002-08-05 14:29                   ` Larry Kilgallen
2002-08-05 14:57                     ` Dmitry A. Kazakov
2002-08-05 15:12                   ` Oleg Goodyckov
2002-08-05 16:20                   ` Darren New
2002-08-05 17:01                     ` Georg Bauhaus
2002-08-05 17:48                       ` Darren New
2002-08-05 19:06                         ` tmoran
2002-08-05 20:08                           ` Darren New
     [not found]                     ` <slrnakv3q9.p2.lutz@taranis.iks-jena.de>
     [not found]                       ` <3D4FEFCB.3B74F5E5@san.rr.com>
2002-08-14  0:07                         ` Randy Brukardt
2002-08-01 14:29     ` Ted Dennison
2002-08-01 16:47       ` Oleg Goodyckov
2002-08-02 14:05         ` Ted Dennison
2002-08-02 16:11           ` Darren New
2002-08-03  0:30             ` Ted Dennison
2002-08-03  0:58               ` Darren New
2002-08-03  2:04                 ` Dale Stanbrough
2002-08-03  2:32                 ` Ted Dennison
2002-08-03  2:47                   ` Darren New
2002-08-03 12:41                     ` Ted Dennison
2002-08-03 16:53                       ` Darren New
2002-08-04  1:08                         ` Ted Dennison
2002-08-04 16:23                           ` Darren New
2002-08-05  2:16                             ` Robert Dewar
2002-08-05  3:45                               ` Darren New
2002-08-05  9:56                     ` Lutz Donnerhacke
2002-08-05 16:02                       ` Darren New
2002-08-14  0:42                         ` Randy Brukardt
2002-08-14  1:45                           ` Darren New
2002-08-14 19:37                             ` Randy Brukardt
2002-08-14 20:25                               ` Stephen Leake
2002-08-14 20:22                           ` Stephen Leake
2002-08-15 19:24                             ` Randy Brukardt
     [not found]                         ` <jb1vkustkugeutalhvrhv1n0k9hqn2fpip@4ax.com>
     [not found]                           ` <3D4FF351.8F4A6C0A@san.rr.com>
2002-08-14  1:03                             ` Randy Brukardt
2002-08-14  1:05                       ` Robert A Duff
     [not found]                       ` <3D4EA1AC.80D17170@s <wccofc6b66u.fsf@shell01.TheWorld.com>
2002-08-14 20:29                         ` Stephen Leake
2002-08-26 17:53                           ` Robert A Duff
2002-08-26 18:40                             ` Chad R. Meiners
2002-08-26 18:52                               ` Robert A Duff
2002-08-26 21:46                                 ` Chad R. Meiners
2002-08-05 13:29                     ` Stephen Leake
2002-08-03  5:07                   ` achrist
2002-08-03 12:52                     ` Ted Dennison
2002-08-05 15:34                       ` Ted Dennison [this message]
2002-08-05 13:24                 ` Stephen Leake
2002-08-05 16:02                   ` Darren New
2002-08-05  7:18           ` Oleg Goodyckov
2002-08-02  1:04     ` tmoran
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox