As for your second question, a recursive process is usually what you want when dealing with lists, because they are a data structure with hollows. Consider the following code:
head (take 100 [1 ..])
If we follow the code, we will eventually arrive at the following expression: 1 : take (100 - 1) [2 ..] . Since we are only interested in the head of the list, the recursive call to take never evaluated. However, if take was to be implemented as an iterative process, it would need to iterate over all 100 elements, even if only the first element was needed.
source share