Wednesday, August 13, 2008

Recursive Functions in ASP

A function that calls itself repeatedly, satisfying some condition is called a Recursive Function. Using recursion, we split a complex problem into its single simplest case. The recursive function only knows how to solve that simplest case. You'll see the difference between solving a problem iteratively and recursively later.

Warning!

Beware! Use the recursion technique carefully, if you fail to handle it appropriately you can end up with a never-ending ASP application.

Same Old Factorial problem

Almost for every language, the beginners learning the concept of recursion are presented with the same old Factorial problem. I'll follow the traditional path, because I feel that it's the easiest way to understand the basic concept of recursion.

Understanding the problem

In mathematics, the factorial of a positive integer n, written as n! is represented by the following formula:

n! = n . (n-1) . (n-2) . (n-3) . Š. . 1

In plain english, factorial of a number is the product of that number with a number 1 less than that number, this multiplication process continues until the number which is being multiplied, eventually becomes equal to 1.

Iterative Solution

In the following function the value of 5! is calculated iteratively:

<%  
Response.Write iterativeFactorial (5)

Function iterativeFactorial ( intNumber )

Dim intCount, intFactorial

intFactorial = 1
For intCount = intNumber To 1 Step -1

intFactorial = intFactorial * intCount
Next
iterativeFactorial = intFactorial
End Function
%>

Recursive Solution

The following function represents the recursive solution for the factorial problem.

<%  
Response.Write recursiveFactorial (5)
Function recursiveFactorial ( intNumber )
If intNumber <= 1 Then
recursiveFactorial = 1 Else
recursiveFactorial = intNumber * recursiveFactorial ( intNumber - 1 )
End If
End Function
%>

The working of the above function recursiveFactorial is simple. If the integer argument "intNumber" is less than or equal to one, then the function returns 1, else the return value of the function is the product of intNumber with the value returned by the same function for integer argument "intNumber-1".

Answer of the above problem:

5! = 5 . (5-1) . (5-2) . (5-3) . (5-4)

Simplifying:

5! = 5 . 4 . 3 . 2. 1 = 120

Example: Folder Tree

The following example will display the tree structure for a specified folder.

<%
' Displays the Tree structure, replaces vbTab character with 3 HTML spaces

Response.Write Replace (DisplayFolderTree ("c:\windows", 0), vbTab, "   ")

Function DisplayFolderTree ( strFolder, intTreeLevel )

Dim objFileSystem, objFolder, objSubFolders, objTempFolder
Set objFileSystem = CreateObject("Scripting.FileSystemObject")

' Get the name of current folder
Set objFolder = objFileSystem.GetFolder ( strFolder )

' Get the list of subfolders
Set objSubFolders = objFolder.SubFolders

' Adds the name of current folder with proper indentation
' intTreeLevel is used only for indenting folder name according to its pos ition
DisplayFolderTree = DisplayFolderTree & String ( intTreeLevel, vbTab) & "•"
DisplayFolderTree = DisplayFolderTree & vbTab & objFolder.Name & "<br>"

' Recursion takes place here
' If any "subfolders exist", the function is repeated for them too!
If objSubFolders.Count > 0 Then
For Each objTempFolder in objSubFolders
strArgument = strFolder & "\" & objTempFolder.Name
DisplayFolderTree = DisplayFolderTree & DisplayFolderTree ( strArgument, intTreeLevel+1 )
Next
End If

' When the control reaches HERE! This means your function has ended
' Now no more recursive calls to the function will take place

End Function
%>


Conclusion

The recursive functions solve the problem in a method much identical to their real-life solutions. In the example above, we simply display the name of current folder. Then we obtain a list of subfolders and repeat the function for each of them.

While using iterative functions we know about the number of iterations, ie. how many times a loop will be executed, in advance.

In the factorial problem, recursion is not necessary because we know that a loop will be executed until the value of the number becomes 1. But, in Folder Tree example, we never know how many subfolders may be present in a folder and how many iterations will be required. For this purpose, the most suitable solution is to call the function recursively to display information about a folder and its subfolders.

Source: http://www.15seconds.com/

No comments: