Recursive function in MAX ?

Feb 8, 2012 at 3:32pm

Recursive function in MAX ?

Hi, I’m trying to translate this Processing code in Max but I can’t understand how create recursive function in Max.
I tried to create an abstract that call itself but I got a Max error “That is not permitted”.
Can someone show me the right way?
Do I have to use jit.linden ?

Processing code to translate:

float theta;

void setup() {
size(640, 360);

void draw() {
// Let’s pick an angle 0 to 90 degrees based on the mouse position
float a = (mouseX / (float) width) * 90f;
// Convert it to radians
theta = radians(a);
// Start the tree from the bottom of the screen
// Draw a line 120 pixels
// Move to the end of that line
// Start the recursive branching!


void branch(float h) {
// Each branch will be 2/3rds the size of the previous one
h *= 0.66;

// All recursive functions must have an exit condition!!!!
// Here, ours is when the length of the branch is 2 pixels or less
if (h > 2) {
pushMatrix(); // Save the current state of transformation (i.e. where are we now)
rotate(theta); // Rotate by theta
line(0, 0, 0, -h); // Draw the branch
translate(0, -h); // Move to the end of the branch
branch(h); // Ok, now call myself to draw two new branches!!
popMatrix(); // Whenever we get back here, we “pop” in order to restore the previous matrix state

// Repeat the same thing, only branch off to the “left” this time!
line(0, 0, 0, -h);
translate(0, -h);

  1. branch.maxpat
Feb 10, 2012 at 9:21am

I try to simplify the question:
this is the recursive function I’m tryig to translate in Max, the problem is the recursion.

void branch(float h) {
h *= 0.66;

if (h > 2) {
line(0, 0, 0, -h);
translate(0, -h);

line(0, 0, 0, -h);
translate(0, -h);

You can see that inside branch() there are two call to itself branch().

Feb 10, 2012 at 11:09am

I dont think max really lends itself to recursive structures, but I think there is a principle in computer science which says that any recursive function can also be expressed as a simple iteration (ie a for-loop), so you could possible rewrite the function non-recursively (in pseudocode), then it would be easier to translate into a max patch.

You might be able to implement it using recursion with Mattijs Kneppers’ oo objects

but having never used them myself, you’d need to check it out to see if it’s actually possible.

you’re may better off overall trying to implement it using java within max


Feb 10, 2012 at 12:05pm

A recursive function can be expressed as a simple iteration only if the recursive call is the last operation of the function (“tail recursion”). Otherwise you need an additional stack for handling the local data. This can be done in Max for example with [zl stack] but seems rather limited and inconvenient.

Feb 10, 2012 at 1:22pm

This can be very easy to do using java inside Mxj. Just learn a bit of the java API for interfacing with max and then you can do as many resursions you want !!

Feb 10, 2012 at 2:54pm
Feb 10, 2012 at 3:23pm

And obligatory Lisp joke:

Feb 10, 2012 at 3:55pm
Feb 11, 2012 at 1:41am

one way to do a “while” loop. interesting to experiment with [defer] and [deferlow] too…

– Pasted Max Patch, click to expand. –
Feb 11, 2012 at 11:38am

Thanks to all maybe mxj or js is the faster way for tree generation.

Feb 13, 2012 at 12:52am

actually you can do this kind of recursion with native max objects/messaging.
The only difference to the processing code is, that you have to carry over all 4 parameters (x,y,h,theta) to the next recursion.

– Pasted Max Patch, click to expand. –
Feb 13, 2012 at 7:44am



You must be logged in to reply to this topic.