A basic definition of recursion would be “call a subroutine from within the same subroutine”. And iteration would be travelling through several objects in a repeat/end repeat statement (items in a list, a growing number, etc.).
Here is the classic example of recursion (a factorial computation):
on factorial(n)
if n > 0 then
return n * (factorial(n - 1))
else
return 1
end if
end factorial
And this is the “iteration version”:
on factorial(n)
if n is 0 then return 1
set a to n - 1
repeat while a > 0
set n to n * a
set a to a - 1
end repeat
return n
end factorial
And this is a different example, just in case you feel dizziness reading this code (as me). These will return true if “B” is in a given string (false, if it isn’t):
on BisIn(str) --> recursion
considering case
if str's item 1 is "B" then
return true
else
try
return BisIn(text 2 thru -1 of str)
on error
return str is "B"
end try
end if
end considering
end BisIn
on BisIn2(str) --> iteration
considering case
repeat with i from 1 to count str
if str's item i is "B" then return true
end repeat
end considering
return false
end BisIn2
Both concepts share the concept loop, and you may use whatever you find more readable. Be careful, though, with recursion, if you think you may recurse lots of times, as you may get out of memory. When you execute “return again(foo)”, the handler will return the result of executing again the handler “again” with parameters “foo”. If the result of such execution is executing again the handler “again”, you will have then two handlers waiting for a result: the first round, and the second one (waiting for the third execution). And so on… This means that you are storing lots of information in memory (in long recursions) and, depending on application-defined stack’s size (the application running the script), you may get a stack overflow error sooner or later.
Brief note about recursion and stack limits: seems that every app defines its owm stack memory limits. For example, if you try this code in current apps’ versions in OS X 10.4:
property x : 0
try
z()
on error
display dialog x
end try
to z()
set x to x + 1
z()
end z
This will display “733” in Apple’s Script Editor (which seems the default value in most of AS runners), and “23815” in Satimage’s Smile.