ScriptBasic > Tutorials

Recursive functions and variable scope

(1/1)

Support:
This example shows calling a function recursively and how to define how variables are created in functions by default. (GLOBAL or LOCAL)


--- Code: ---FUNCTION PlusMinusOne(arg)
  IF limit < 5 THEN
    limit += 1
    arg += 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  ELSE IF arg <> 0 THEN
    arg -= 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  END IF 
  PlusMinusOne = "Done"
END FUNCTION

limit = 0

x = PlusMinusOne(0)

PRINT x,"\n"
PRINTNL
PRINT arg,"\n"
PRINT limit,"\n"

END

--- End code ---

C:\scriptbasic\test>recurfunc
1
2
3
4
5
4
3
2
1
0
Done

undef
5

C:\scriptbasic\test>

In this example I define and assign a GLOBAL variable within the function and reference it in main. By default, variables are global unless explicitly declared as LOCAL in SUBs and FUNCTIONs. SB allows switching this functionality so variables are LOCAL by default in functions/subs and you must explicitly declare variables GLOBAL.


--- Quote from: SB Docs ---declare option DefaultLocal

This will mean that all variables inside a function or subroutine following this line will be local unless explicitly declared to be global.

--- End quote ---


--- Code: ---FUNCTION PlusMinusOne(arg)
  IF limit < 5 THEN
    limit += 1
    arg += 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  ELSE IF arg <> 0 THEN
    arg -= 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  END IF
  funcvar = "Defined/assigned in the function" 
  PlusMinusOne = "Done"
END FUNCTION

limit = 0

x = PlusMinusOne(0)

PRINT x,"\n"
PRINTNL
PRINT arg,"\n"
PRINT funcvar,"\n"
PRINT limit,"\n"

END

--- End code ---

C:\scriptbasic\test>recurfunc
1
2
3
4
5
4
3
2
1
0
Done

undef
Defined/assigned in the function
5

Look what happens when we add DECLARE OPTION DefaultLocal as to the top of the above program. Since limit isn't GLOBAL it's no longer STATIC and breaks the function.

C:\scriptbasic\test>rflocal
Done

undef
undef
0

C:\scriptbasic\test>

Okay, lets fix the program by declaring limit GLOBAL.


--- Code: ---DECLARE OPTION DefaultLocal

FUNCTION PlusMinusOne(arg)
  GLOBAL limit
  IF limit < 5 THEN
    limit += 1
    arg += 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  ELSE IF arg <> 0 THEN
    arg -= 1
    PRINT arg,"\n"
    PlusMinusOne(arg)
  END IF
  funcvar = "Defined/assigned in the function" 
  PlusMinusOne = "Done"
END FUNCTION

limit = 0

x = PlusMinusOne(0)

PRINT x,"\n"
PRINTNL
PRINT arg,"\n"
PRINT funcvar,"\n"
PRINT limit,"\n"

END

--- End code ---

C:\scriptbasic\test>rflocal
1
2
3
4
5
4
3
2
1
0
Done

undef
undef
5

C:\scriptbasic\test>

Navigation

[0] Message Index

Go to full version