cool
Peter Scott
Peter at PSDT.com
Mon Feb 3 17:16:17 CST 2003
At 03:10 PM 2/3/03 -0800, nkuipers wrote:
>Yes you are right, this case is just as effectively solved
>non-recursively and
>the reminder not to get carried away is well received. If I were to chide
>your solution however, I might say that it is very difficult to read
>to anyone
>not familiar with a breadth of perl idioms, everything from shift and qw()
>which I also used, to preceding parens with + for making something not look
>like a function call (if I remember correctly), => comma equivalence,
>and some
>rather heavy operator chaining.
>
>;)
See, it's not just a function but a tutorial! :-)
Okay, perhaps you'd prefer:
sub makeDNA {
my $count = shift;
my @bits = qw(A C G T);
my $res;
for (1 .. $count) {
$res .= $bits[rand @bits];
}
return $res;
}
>nathanael
>
>
> >===== Original Message From Peter Scott <Peter at PSDT.com> =====
> >At 12:58 PM 2/3/03 -0800, nkuipers wrote:
> >>I played around in recursion a bit, wanting to get the practice but
> >>also to do
> >>something useful. So I framed it to myself as an exercise. This was
> >>my first
> >>idea:
> >>[snip]
> >>sub makeDNA {
> >> my $n = shift;
> >> my @alphabet = qw( A C G T);
> >> if ($lengthRemaining == 0)
> >> {
> >> return;
> >> }
> >> print $alphabet[int(rand(4))];
> >> makeDNA($n - 1);
> >>}
> >>
> >>makeDNA(10);
> >>print "\n";
> >>
> >>This could develop into a small host of other recursive, random
> >>functionalities useful for bioinformatics, such as taking a sequence and
> >>randomly mutating n residues. I will be incorporating above subroutine and
> >>possibly others in my BIO::Basic module.
> >
> >Well, hold on a second... fun as recursion may be, it is not a
> >panacea. It is only optimal in the cases where you really do find
> >yourself wanting to call the same function from within itself. I
> >suggest familiarizing yourself with a number of classic uses of
> >recursion before deciding to use it. Look for: The Tower of Hanoi,
> >Ackerman's function, and anything to do with parsing a stream which may
> >be lexically recursive in some fashion.
> >
> >I'd write yon function above as
> >
> >sub makeDNA
> >{
> > join '' => map +(qw(A C G T))[rand 4] => 1 .. shift;
> >}
> >
> >In general, don't print from inside utility functions. Return strings
> >instead so you can either print them or decide to do something else
> >with them (e.g., run them through tests).
> >
> >--
> >Peter Scott
> >Pacific Systems Design Technologies
> >http://www.perldebugged.com/
--
Peter Scott
Pacific Systems Design Technologies
http://www.perldebugged.com/
More information about the Victoria-pm
mailing list