This is pretty old, but just in case someone else comes along, I believe you're reading it right. Your long hand version should be enough to understand the algorithm.
:[...] is "if". It's a control structure whose help is available with
\.. The / at here represents converge because the function takes two arguments. It applies the function to the first two elements and then to the result of that with the next element, etc. If you use \ instead you can see all the intermediate results. I haven't used "trace" mentioned below but that may also give you similar insight. I'd look it up in the K2 manual linked in the wiki.
\.
...
Control Flow
:[x1;t1;x2;t2;...;xn;tn;else] evaluate xi until true and return ti, otherwise return else
:[0;10;0;20;1;30;40] yields 30
if[x;e1;...;en] if x then evaluate all e. if[j>i;a:1;b:2]
do[m;e1;...;en] do all e m times. do[100;f[i];i+:1]
while[x;e1;...;en] while x do e. while[a>b; f a; a-:1]
/ starts a comment. Must begin a line or have a space before
\ is trace when beginning an expression inside a function (todo)
: is early return when beginning an expression inside a function
' is signal (todo)
{x*y%{:[y;_f[y]x!y;x]}[x]y}/1+!20
232792560
{x*y%{:[y;_f[y]x!y;x]}[x]y}\1+!20
1 2 6 12 60 60 420 840 2520 2520 27720 27720 360360 360360 360360 720720 12252240 12252240 232792560 232792560