Elaborating on what Raul and Michael said:

   even`odd@.isOdd 10
5
   even`odd@.isOdd 11
34

gives you one step of Collatz.  Succeeding application of the same thing to
the results would suggest using the power conjunction, but I can't quite
figure out the right way to do it:

   collatzNotDone=: 1<]
   ((even`odd@.isOdd)^:collatzNotDone)^:_]10
1

but what you probably want is the actual sequence leading to the terminal
1, not the result itself.



On Mon, Mar 3, 2014 at 2:14 PM, Raul Miller <rauldmil...@gmail.com> wrote:

> Er... actually you only had one other question to be answered. Oops.
>
> Thanks,
>
> --
> Raul
>
>
> On Mon, Mar 3, 2014 at 2:13 PM, Raul Miller <rauldmil...@gmail.com> wrote:
> > Answering your questions in order:
> >    2&%~
> > is equivalent to
> >    (2&%)~
> >
> > If you want a more detailed explanation of why this is, don't hesitate
> > to ask, but you have a number of other questions to be answered...
> >
> > As for if statements, J actually has them
> > (http://www.jsoftware.com/help/dictionary/cif.htm) but they only work
> > in explicit definitions, they cannot be a part of sentence. And, like
> > Michael Dykman points out, agenda is probably what you are looking for
> > (http://www.jsoftware.com/help/dictionary/d621.htm).
> >
> > But there's another way: you can multiple one of these expressions by
> > zero, and another by 1 and then add them together.
> >    even=: %&2
> >    odd=: 1 + *&3
> >    isOdd=: 2&|
> >    ((even,:odd) +/@(* isOdd) 1 0 +/ ]) i. 5
> > 0 4 1 10 2
> >
> > There's other ways of expressing that, of course. For example:
> >    isEven=: isOdd@+&1
> >    ((even * isEven) + (odd * isOdd)) i. 5
> > 0 4 1 10 2
> >
> > Note that the parenthesis around odd * isOdd in that last expression
> > was unnecessary.
> >
> > Still, agenda also works, and some people prefer it.
> >
> > Note also that at the machine code level, the multiply and add
> > approach would typically give better performance than the test and
> > branch approach. This has to do with the architecture of modern
> > machines (branch prediction is expensive).
> >
> > Thanks,
> >
> > --
> > Raul
> >
> > On Mon, Mar 3, 2014 at 11:30 AM, Jon Hough <jgho...@outlook.com> wrote:
> >> Beginner question again.I quick task I set myself was to write ONE
> ITERATION of the Collatz function for a given positive integer.
> http://en.wikipedia.org/wiki/Collatz_conjecture
> >>
> >> So my verb is supposed to do 3*n+1 if n is odd and n/2 if n is even.In
> a more imperative/OOE based language (C/C++/Java) I could write this in
> less than a minute. Unfortunately, I fell at the very first hurdle in J.
> >> I originally wrote my tacit verb for even ints:collatz_even =.2&(%~)
> >> collatz_even 4
> >> 2
> >> This works, but I had a terrible time trying to put the brackets in the
> right place. I am not sure why %~ needs to be bracketed. Won't J parse %~
> as dyadic and "know" that the left operand is 2?
> >> Next I tried to do the case for odd n:
> >> collatz_odd =. 1&+@(3&*)   collatz_odd 3
> >> 10
> >> That seems to work ok.Now I am not sure how to do an if statement in J.
> In plain English I want "If n is even do collatz_even else do
> collatz_odd".The verb I wrote to test for even-ness is
> >> ones =. {:@#: NB. Finds the ones column values. 1 => odd, 0=> even
> >> 1 = ones 2
> >> 0
> >> So I have a test but I am not sure how to utilize this test. How should
> I go about doing:"If n is even do collatz_even else do collatz_odd"?
> >> Thanks and regards,Jon
> >>
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>



-- 
Devon McCormick, CFA
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to