Почему не нужно заранее объявлять массив?
Почему не нужно заранее объявлять массив?

Как правильно заметили в комментарии выше, "это РНР, тут так можно". 
Раньше вообще можно было инициализировать переменную как строку, и потом обращаться к ней, как к массиву.
Начиная с 7 версии начался отход от таких вольностей, но он всё ещё  в процессе.

Значит то что пишут $result = [] Это я удобства?

Не для "удобства", а для того, чтобы волосы на голове сохранились подольше. 
В данном случае нужды в явном присвоении нет.
Но любой код со временем изменяется. И функция tower_builder() может разрастись. Там появится ещё один цикл, который работает с массивом $result. Который получит какое-то значение до начала нашего цикла, и в итоге конечный результат будет неправильным. Поэтому $result = [] перед началом работы с массивом - это не каприз или удобство, а необходимость
php слишком многое прощает.

Если в вашу функцию передать $n <=0, то будет Notice/Warning (от версии php зависит).
https://onlinephp.io/c/7167c

Но если задать значение по умолчанию для $result, то ошибки уже не будет.

Советую присмотреться к статическим анализаторам кода:
https://psalm.dev/r/296a277b14
https://phpstan.org/r/13fea7ab-0cb4-492c-8241-7b26...