[Cuis-dev] feedback on simple code
Mark Volkmann
r.mark.volkmann at gmail.com
Thu Jun 6 06:09:22 PDT 2024
Andres, thank you so much for the feedback! I didn't know I could return
early in a method like you showed and hadn't considered the difference
between / and //.
On Wed, Jun 5, 2024 at 5:37 PM Andres Valloud via Cuis-dev <
cuis-dev at lists.cuis.st> wrote:
> Hi, ifTrue: is supposed to take a block argument, so it should be
> ifTrue: [nil]. And to prevent indenting the entire method, consider
>
> self < 1 ifTrue: [^nil].
> ... etc...
> ^seq
>
> It's perfectly fine to have multiple return statements.
>
> By the way, use // 2 instead of / 2, because / 2 will try to make a
> fraction to then discover that next was even. But now you know next is
> even, so you can do next // 2. Using / is still correct of course.
>
> I wouldn't worry about doing bitShift: -1 instead of // 2 here. That
> kind of "speedup" is barking at the wrong forest (not even the wrong
> tree) from the perspective of Collatz. I would familiarize myself with
> the difference between the pairs "//, \\", "quo:, rem:", and "div:,
> mod:", however.
>
> On 6/5/24 11:16 AM, Mark Volkmann via Cuis-dev wrote:
> > I took another shot at simplifying the code. I didn't need to use
> > recursion. I can do this instead as an instance method added to the
> > Integer class:
> >
> > collatz
> > "answers an OrderedCollection containing the Collatz sequence for
> > this integer"
> >
> > | next seq |
> > ^self < 1
> > ifTrue: nil
> > ifFalse: [
> > next := self.
> > seq := OrderedCollection new.
> > seq addLast: next.
> > [next = 1] whileFalse: [
> > next := next even ifTrue: [next / 2] ifFalse: [next * 3 + 1].
> > seq addLast: next
> > ].
> > ^seq
> > ]
> >
> > Beside the lack of memoization and the "orbit" concept, what would you
> > change about this?
> >
> >
> > On Wed, Jun 5, 2024 at 12:40 PM Mark Volkmann <r.mark.volkmann at gmail.com
> > <mailto:r.mark.volkmann at gmail.com>> wrote:
> >
> > See my replies inline below with some parts snipped to focus my
> replies.
> >
> > On Wed, Jun 5, 2024 at 12:19 PM Andres Valloud via Cuis-dev
> > <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>> wrote:
> >
> > Always be on the lookout for when a receiver is just self.
> > Otherwise,
> > the code is not using the knowledge it has of where it is
> > implemented
> > (and this leads to all sorts of problems later).
> >
> >
> > Ah! I did not know that I could use `self` to refer to the class in
> > a class method.
> >
> > Also, you can accomplish the same with much less code. Any time
> > you
> > have a class whose class methods offer a "service" but do not
> > really
> > have instances, you should suspect the code should be placed
> > elsewhere.
> >
> >
> > I see that I don't need the next: method and can just move that code
> > in the gather:seq: method.
> > But it's not apparent to me what else I can do to make the code
> shorter.
> >
> > Side comment: I've been working on the Collatz problem for a
> *long*
> > time, so I have quite a few opinions on how to go about writing
> > specifically this code...
> >
> >
> > I know I could add caching of results to make subsequent calls with
> > different integers much faster.
> >
> > But in this particular case, what you're collecting is the orbit
> > of an
> > integer (so, anInteger, not aNumber).
> >
> >
> > Excellent point! I changed every occurrence of `aNumber` to
> > `anInteger` in my code.
> >
> > --
> > R. Mark Volkmann
> > Object Computing, Inc.
> >
> >
> >
> > --
> > R. Mark Volkmann
> > Object Computing, Inc.
> >
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
>
--
R. Mark Volkmann
Object Computing, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20240606/8203b522/attachment.htm>
More information about the Cuis-dev
mailing list