Recursive functions and Advanced Graphing
|
09-11-2018, 12:34 PM
Post: #1
|
|||
|
|||
Recursive functions and Advanced Graphing
I’m intrigued by the ability of the Prime to handle recursion in simple function definitions.. but also its limitations.
Note - I’m just using the Lite app at present, so have no access to programming. Ay first sight, it appears that the Define function does not allow you to reference the function being defined. If I try to define fact(X)=when(X<=2,X,X*fact(X-1)), it gives a syntax error. However, I discovered that if you first define fact as a non-recursive function, e.g. X*(X-1), and exit the Define screen, the calculator ‘learns’ that “fact” is a function; you can then go back in and edit the function to make the recursive call to itself. Sure enough, fact(5) gives 120. (The calculator does struggle after roughly 35 iterations, presumably as the stack overflows, but that’s to be expected.) Next, I plot fact(X)in the Graphing app. It’s a tad slower than plotting a ‘normal’ function, but very impressive! I now go into Advanced Graphing, and try Z1: Y=fact(X)... and sadly get an ‘Invalid object’ error. Does anyone know why this fails, and if there’s a way around it? (Motivation: what I really want to do is define mandelbrot(N, Z, C)= when(N<2, |Z|<2, mandelbrot(N-1, Z^2+C),C), and plot mandelbrot(20, 0, X+Yi)=1 ! :-) ) |
|||
09-11-2018, 04:44 PM
Post: #2
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
(09-11-2018 12:34 PM)Sven44 Wrote: (Motivation: what I really want to do is define mandelbrot(N, Z, C)= when(N<2, |Z|<2, mandelbrot(N-1, Z^2+C),C), and plot mandelbrot(20, 0, X+Yi)=1 ! :-) ) Since it's tail recursive, can't you do it by iteration instead of by recursion? — Ian Abbott |
|||
09-11-2018, 04:53 PM
Post: #3
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
(09-11-2018 04:44 PM)ijabbott Wrote: Since it's tail recursive, can't you do it by iteration instead of by recursion? That would be great - but is there a library function to perform iteration? Remember this is in the purely functional 'Define' environment.. I can't write a procedural program. thanks |
|||
09-12-2018, 04:30 AM
Post: #4
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
The Advanced Graphing app is rather special in terms of which functions/equations it works for. I don't know what exactly the requirements are unfortunately, but I'm getting the same error for `RE((x+i*y)^3)=0` for example (the i appears to be the problem). I suspect that recursive functions might simply not be supported there.
I think there's some sophisticated algorithm at work in the Advanced Graphing app that performs some kind of analysis and/or calculus on the equation, though again I'm not sure what exactly that is. Maybe it's using gradients to find roots or something like that? |
|||
09-12-2018, 05:25 AM
Post: #5
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
Hello,
The advanced grapher uses its own "evaluator" which is mostly float based. This is why your function does not work... I think that "when" is a CAS function, which does not help... Try using IFTE which is a home function instead, it will, at minimum speed up things and allows for larger recurssion. Cyrille Although I work for the HP calculator group, the views and opinions I post here are my own. I do not speak for HP. |
|||
09-12-2018, 09:21 AM
Post: #6
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
Thanks both for those answers.
I've switched to IFTE (wasn't familar with that), and that certainly seems to be an improvement in terms of just invoking the function from the home screen - as you say, handles larger numbers, and quite a bit faster in the simple graphing app too. But still no luck in the advanced grapher. I think you're both right - it must be doing all kinds of clever optimisation, pre-compilation, interpolation or whatever else, and just can't handle recursive user-defined functions. (Even my factorial function, changed to using IFTE.) It does happily plot a simple user-defined function though, like Y=Squ(X), = X*X. Oh well... it was probably asking a bit much! |
|||
09-12-2018, 07:14 PM
Post: #7
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
(09-12-2018 05:25 AM)cyrille de brébisson Wrote: Hello, Cyrille, "allows for larger recursion" How about lifting the stupid 100 recursion of variable/function limit It was okay in the days of the previous 39G/40G calculators Now we have have a super calculatrice. Limit, if any, could be ~ (2^31)-1 |
|||
09-13-2018, 06:17 AM
Post: #8
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
Hello,
"How about lifting the stupid 100 recursion of variable/function limit" Which restriction are you refering to here? It does not strike a bell that there is such restriction, at least in home. We have restrictions on things like list (10K elements I think)... but not on variables/functions... Functions do have a hard limit of 16 parameters, but this is due to memory structures, not because of an arbirary limit. Cyrille Although I work for the HP calculator group, the views and opinions I post here are my own. I do not speak for HP. |
|||
09-13-2018, 10:11 AM
Post: #9
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
(09-13-2018 06:17 AM)cyrille de brébisson Wrote: Hello, CAS Settings Page 2 The maximum of these is 100; it could be 2,147,483,647 Recursive Evaluation Recursive Replacement Recursive Function --------------------------------------- |
|||
09-14-2018, 05:31 AM
Post: #10
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
Hello,
Ho, that CAS setting... I will see with Bernard why it is there... Cyrille Although I work for the HP calculator group, the views and opinions I post here are my own. I do not speak for HP. |
|||
09-14-2018, 08:44 AM
Post: #11
|
|||
|
|||
RE: Recursive functions and Advanced Graphing
(06-14-2014 06:43 PM)parisse Wrote: I don't know any portable way to check for stack overflow in C. That's the reason for the max recursive eval parameter. Initially, you got a runtime error if the max number of recursive calls was reached, later I implemented a non-recursive evaluator (with dynamic allocation of the space required to make recursive calls), you don't get an error anymore, but it's slower, therefore the warning remains. Perhaps on the G2, with 256Mb ram, the restriction could be relaxed? |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 4 Guest(s)