This is because if there isn't an explicit return the last statement
evaluated is the implied return value.

So the last call (which returns Nil) was your implicit return.

Generally I try and avoid an implicit return if a function has more than a
couple of lines.

On Thu, 16 Jun 2022, 21:41 Rick Bychowski, <r...@hiranyaloka.com> wrote:

> For example here:
>
>
> https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-168/rick-bychowski/raku/ch-2.raku
>
> I called the recursive function at various points in an if/else
> statement, but each call was always the very last statement of the
> branch/routine. Otherwise, even a trailing "last" or "exit" silently
> "fails".
>
> All good!
>
> - Rick
>
> On 6/16/22 13:21, Rick Bychowski wrote:
> > Yep, the "return factors($q, @f)" fixes it. I've not called a recursion
> > from anywhere other than the end of a routine, so haven't run into this
> > issue before. Learned something today!
> >
> > Thanks to Simon, William and Andinus for your assistance!
> >
> > - Rick
> >
> > On 6/16/22 11:07, Simon Proctor wrote:
> >> I think, and I don't have my computer to hand to double check but I
> >> think you want a return before your recursive.call to factors passing
> >> in @f.
> >>
> >> When dealing with recursive functions you need to make sure what
> >> you're returning back up the stack.
> >>
> >>
> >>
> >> On Thu, 16 Jun 2022, 18:10 Rick Bychowski, <r...@hiranyaloka.com
> >> <mailto:r...@hiranyaloka.com>> wrote:
> >>
> >>     Hi Everyone,
> >>
> >>     I've been lurking quite a while, this will be my first post to perl6
> >>     users. I've written a lot of short scripts in perl5 for system admin
> >>     type stuff at home and work. Lately I'm playing with Raku, which is
> a
> >>     lot of fun. Error reporting is excellent, as is the online
> >>     documentation.
> >>
> >>     To the point. I recently started the perl weekly challenge. Lots of
> >>     math/primes stuff. I wrote an algorithm to list all the prime
> >>     factors of
> >>     an integer, using a recursive subroutine. I'm able to print the
> >> result
> >>     from the subroutine, but it always returns Nil. What am I missing?
> >>
> >>     #!/usr/bin/env raku
> >>
> >>     sub MAIN($n = 20) {
> >>          .say for factors($n); # Nil
> >>     }
> >>
> >>     sub factors($n, @factors?) {
> >>           my @f = @factors.elems ?? @factors !! ();
> >>           my $q;
> >>           for 2 ..^ $n -> $i {
> >>               if $n %% $i {
> >>                   $q = Int($n / $i);
> >>                   @f.push($i);
> >>                   if $q.is-prime {
> >>                       @f.push($q);
> >>                       say @f;    # [2 2 5]
> >>                       return @f;
> >>                   } else {
> >>                       factors($q, @f);
> >>                   }
> >>                   last;
> >>               }
> >>           }
> >>     }
> >>
> >>     Returns
> >>     [2 2 5]
> >>     Nil
> >>
> >>     --     Rick Bychowski
> >>
> >>     The information in this email is confidential and may be legally
> >>     privileged. It is intended solely for the addressee(s). Access to
> >> this
> >>     e-mail by anyone else is unauthorized.
> >>
> >
>
> --
> Rick Bychowski
>
> The information in this email is confidential and may be legally
> privileged. It is intended solely for the addressee(s). Access to this
> e-mail by anyone else is unauthorized.
>

Reply via email to