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