# 7.5 Recursively Defined Data

While the data you've processed with references up to this point has been rather fixed-structure, sometimes you have to deal with hierarchical data, which is often defined recursively.

For example, a company organization chart has managers with direct reports, some of whom may also be managers themselves, or an HTML table that has rows containing cellsand some of those cells may also contain entire tables. The chart could also show a filesystem consisting of directories containing files and other directories.

You can use references to acquire, store, and process such hierarchical information. Frequently, the routines to manage the data structures end up as recursive subroutines. A recursive subroutine has a branch from which it calls itself to handle a portion of the task, and a branch that doesn't call itself to handle the base cases.

For example, a recursive subroutine handling the factorial function, which is one of the simplest recursive functions, might look like:

```sub factorial {
my \$n = shift;
if (\$n <= 1) {
return 1;
} else {
return \$n * factorial(\$n - 1);
}
}```

Here you have a base case where \$n is less than or equal to 1, that does not invoke the recursive instance, along with a recursive case for \$n greater than 1, which calls the routine to handle a portion of the problem (i.e., compute the factorial of the next lower number).

This task would probably be solved better using iteration rather than recursion, even though the classic definition of factorial is often given as a recursive operation.   Chapter 1. Introduction  Chapter 2. Building Larger Programs  Chapter 3. Introduction to References  Chapter 4. References and Scoping  Chapter 5. Manipulating Complex Data Structures  Chapter 6. Subroutine References  Chapter 7. Practical Reference Tricks  7.1 Review of Sorting  7.2 Sorting with Indices  7.3 Sorting Efficiently  7.4 The Schwartzian Transform  7.5 Recursively Defined Data  7.6 Building Recursively Defined Data  7.7 Displaying Recursively Defined Data  7.8 Exercises  Chapter 8. Introduction to Objects  Chapter 9. Objects with Data  Chapter 10. Object Destruction  Chapter 11. Some Advanced Object Topics  Chapter 12. Using Modules  Chapter 13. Writing a Distribution  Chapter 14. Essential Testing  Chapter 15. Contributing to CPAN  Appendix A. Answers to Exercises