Recursive programs in XCAS. - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html) +--- Forum: HP Prime (/forum-5.html) +--- Thread: Recursive programs in XCAS. (/thread-7759.html) Recursive programs in XCAS. - John P - 02-12-2017 12:22 AM Hello, Can I write recursive programs in XCAS? I know that I can do recursive programs in HP PRIME, but I am trying to write some in XCAS and they do not work. Thank you, John P RE: Recursive programs in XCAS. - Han - 02-12-2017 01:41 AM Can you provide a bit more information on what you have tried? Perhaps a snippet of code might provide a better idea of what you are trying to achieve. Or even a better description of what you wan to do beyond a generic description of "recursive program." Fibonnaci example Code: ``` fibon(n):= begin   if (n == 1) then return(1); end;   if (n == 2) then return(1); end;   if (n > 2) then     return( fibon(n-1) + fibon(n-2) );     end; end;``` In general, any CAS code on the HP Prime should port as easily as copy/paste -- WITH EXCEPTIONS FOR A FEW COMMANDS (e.g. idenmat() on xcas is identity() ) RE: Recursive programs in XCAS. - John P - 02-12-2017 02:08 AM (02-12-2017 01:41 AM)Han Wrote:  Can you provide a bit more information on what you have tried? Perhaps a snippet of code might provide a better idea of what you are trying to achieve. Or even a better description of what you wan to do beyond a generic description of "recursive program." Fibonnaci example Code: ``` fibon(n):= begin   if (n == 1) then return(1); end;   if (n == 2) then return(1); end;   if (n > 2) then     return( fibon(n-1) + fibon(n-2) );     end; end;``` In general, any CAS code on the HP Prime should port as easily as copy/paste -- WITH EXCEPTIONS FOR A FEW COMMANDS (e.g. idenmat() on xcas is identity() ) Actually, I am trying to port the program, that you provided some time ago for HP Prime, to the PocketCAS on my iPhone 6+. On the HP Prime it works great, but on the iPhone 6+ I can't get it to work. Below I paste your original prgm. for the computation of the set of combinations from the set (list). EXPORT COMBOSET(s,n) BEGIN local l:={}; local sl:={}; local tl:={}; local i,j; local m:=size(s); case if n==m then l:={s}; end; if n==1 then l:=makelist({s(X)},X,1,m); end; if n>m then l:={}; end; for i from 2 to m-n+2 do sl:=sub(s,i,m); tl:=COMBOSET(sl,n-1); for j from 1 to size(tl) do tl(j):=concat({s(i-1)},tl(j)); end; l:=concat(l,tl); end; end; return(l); END; RE: Recursive programs in XCAS. - John P - 02-12-2017 02:32 AM (02-12-2017 01:41 AM)Han Wrote:  Can you provide a bit more information on what you have tried? Perhaps a snippet of code might provide a better idea of what you are trying to achieve. Or even a better description of what you wan to do beyond a generic description of "recursive program." Fibonnaci example Code: ``` fibon(n):= begin   if (n == 1) then return(1); end;   if (n == 2) then return(1); end;   if (n > 2) then     return( fibon(n-1) + fibon(n-2) );     end; end;``` In general, any CAS code on the HP Prime should port as easily as copy/paste -- WITH EXCEPTIONS FOR A FEW COMMANDS (e.g. idenmat() on xcas is identity() ) Yes, the example of fibon() you provided works on my iPhone 6+ so, recursive programs are possible in PocketCAS. I must be making some mistake(s) in porting the program. Thank you very much. John P RE: Recursive programs in XCAS. - Han - 02-12-2017 02:52 AM First, please understand that non-CAS programs do not behave the same way as CAS programs. The combo set program is a non-CAS program. So commands like makelist() are actually two different commands: In "Home" programs (i.e. non-CAS programs), upper/lower case does not matter. So makelist() is actually parsed as MAKELIST(), which is a different command from the CAS makelist(). In CAS programs, upper/lower case DOES matter. The CAS version of makelist() is: makelist( cas-function, var, start, end ) where cas-function is an actual function. For example, when you define a function f(x):=x^2 in the CAS view, you are actually creating the variable f whose content is the CAS-object (x)->x^2. The point here is that f(x):=x^2 is the same as f:=(x)->x^2. So it is this type of function (the right hand side being an example) that is the first argument in makelist(). In your case, makelist( (X)->s[X], X, 1, m ) is what you would want. Notice the s[X] as opposed to s(X) -- this is to remove any ambiguity in the CAS side whether s is a function vs. an indexed object (i.e. list). RE: Recursive programs in XCAS. - Han - 02-12-2017 04:06 AM Just for fun, create the program below. Then in the CAS view, type: purge(x); f:=x^2-3*x+4; CRPN(f); Recursive Program Example: Code: ```#pragma mode( separator(.,;) integer(h32) ) #cas CRPN(f):= begin   local rpn, op, par, n, j, g;   rpn:="";   op:="";   par:="";   if (type(f) <> DOM_SYMBOLIC) then     rpn:=string(f);     return(rpn);   end;   op:=string(f[1]);   n:=size(op);   op:=MID(op,2,n-2);   n:=dim(f) + 1;   for j from 2 to n do     g:=f[j];     if (type(g) <> DOM_SYMBOLIC) then       par:=string(g);     else       par:=CRPN(g);     end;     if (j > 2) then rpn:=rpn + " "; end;     rpn:=rpn + par;     if ((j > 2) or (n == 2)) then       rpn:=rpn + " " + op;     end;   end;   return(rpn); end; #end``` RE: Recursive programs in XCAS. - Han - 03-01-2017 04:46 AM Here's a CAS version that works on the Prime. Notice the upper-case MAKELIST command (which is different from the lower-case makelist command). MAKELIST is a non-CAS command. This was a quick conversion from non-CAS to CAS (which does not support CASE as far as I can tell; it does have CASES, though, which seems to be the same as piecewise). You can make the code much cleaner using several return() calls. PHP Code: `#cascomboset(s,n):=BEGINlocal l;local sl;local tl;local k;local j;local m;local t;m:=size(s);l:={};sl:={};tl:={};if n==m then l:={s}; else  if n==1 then l:=MAKELIST({s(X)},X,1,m); else     if n>m then l:={}; else      for k from 2 to m-n+2 do        sl:=sub(s,k,m);         tl:=comboset(sl,n-1);        for j from 1 to size(tl) do          tl[j]:=concat({s[k-1]},tl[j]);        end;        l:=concat(l,tl);       end;    end;  end;end;return(l);END;#end ` RE: Recursive programs in XCAS. - Han - 03-01-2017 04:49 AM Slightly more readable version. EDIT: Also removed MAKELIST() call since PocketCAS probably does not have that version of the command. PHP Code: `#cascomboset(s,n):=BEGINlocal l;local sl;local tl;local k;local j;local m;local t;m:=size(s);l:={};sl:={};tl:={};if n==m then l:={s}; return(l); end;if n==1 then    for k from 1 to m do        l[k]:={s[k]};    end;    return(l);end;if n>m then l:={}; return(l); end;for k from 2 to m-n+2 do    sl:=sub(s,k,m);     tl:=comboset(sl,n-1);    for j from 1 to size(tl) do        tl[j]:=concat({s[k-1]},tl[j]);    end;    l:=concat(l,tl); end;return(l);END;#end `