Given this naive recursive function:

```
def the largest_tower (heights_and_widths, prev_height = 1000, prev_width = 1000):
if it is not alturas_y_widths:
return 0
results = {0}
for i in range (len (heights_and_widths)):
current_height, current_width = heights_and_widths[i]
if current_height <prev_height and current_width <prev_width:
subarray = heights_and_widths[:i] + alturas_y_widths[i+1:]
results.add (1 + larger_tower (subarray, current_height, current_width))
return max (results)
```

At first glance, I would have said that the temporal complexity of this function is O (n ^ 2). But, if I'm not wrong, I would explain it with simple words would be: *This function can call itself (n-1) + (n-2) + ... + 1 times, being that O (n ^ 2), but a total of n times, so the complexity of real time is O (n ^ 3)*. I'm right

And for the memorized version:

```
def Click for mayor_tower_memoized (heights_and_widths, prev_height = 1000, prev_width = 1000, cache = None):
if it is not alturas_y_widths:
return 0
if the cache is None:
cache = {}
results = {0}
for i in range (len (heights_and_widths)):
current_height, current_width = heights_and_widths[i]
if current_height <prev_height and current_width <prev_width:
subarray = tupla (heights_and_widths[:i] + alturas_y_widths[i+1:])
if (current_height, current_width) is not cached:
cache[(current_height, current_width)] = mayor_tower_memoized (
subarray, current_height, current_width, cache
)
results.add (1 + cache[(current_height, current_width)])
return max (results)
```

I find this more complicated to explain. My intuition tells me that it is `In)`

, since the recursion tree for each entry is generated only once, but I'm not sure.