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

Reply via email to