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