Here's my new go to prime-factors function : sub prime-factors( Int $n is copy where * > 1 ) { gather { while ( $n > 1 ) { if ( $n.is-prime ) { take $n; last; } my $f = (2..^$n/2).grep($n %% *).first(*.is-prime); take $f; $n = $n div $f } } }
On Fri, 17 Jun 2022 at 03:51, Simon Proctor <simon.proc...@gmail.com> wrote: > 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. >> > -- Simon Proctor Cognoscite aliquid novum cotidie http://www.khanate.co.uk/