collatz=:-:&(+2&|*>:&+:) collatz ^:(i.10)17 17 26 13 20 10 5 8 4 2 1
Den 20:15 mandag den 3. marts 2014 skrev Raul Miller <[email protected]>: 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 <[email protected]> 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 <[email protected]> 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 > > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
