@Traver: Wie kann man denn bei so maximal 5 bis 7 Variablen den Überblick verlieren? Oder hast Du mehr? Vielleicht sogar ”beliebig” viele in einem intransparenten **kwargs-Wörterbuch, welches nur existiert weil Du nicht immer so viele Argumente bei den Aufrufen hinschreiben wolltest? Dann ist *das* das Problem, und ist es auch bei einer nicht-rekursiven Lösung. Denn ob sich die Laufzeitumgebung Zwischenzustand implizit merkt, oder ob Du da noch zusätzlichen Code schreiben musst, der den Stapel *richtig* verwaltet, macht kaum einen Unterschied. Also ausser den, dass der implizite Aufrufstapel schon das richtige macht — ob Dein selbst geschriebener Stapel-Code das äquivalent macht, oder ob Du dabei auch Fehler oder noch kompliziertere Umwege machst, ist der Unterschied.
Ich würde in jedem Fall erst eine funktionierende rekursive Lösung schreiben und testen. Weil das einfacher ist! Und wenn die nachprüfbar läuft, das ganze iterativ umformulieren. Um Rekursion kommst Du in keinem Fall herum, denn auch iterativ formuliert ist das letztlich ja eine rekursive Lösung, weil es eine rekursive Datenstruktur ist die traversiert wird. Und gerade wenn die Implementierung so komplex für Dich ist, das Du teilweise mit raten/Versuch & Irrtum gearbeitet hast, ist gründliches (automatisiertes) Testen hier sicher wichtiger als alles andere.
Was heisst idiotensicher? Auch eine iterative Lösung hat ihre Grenzen. Klar ist es noch unwahrscheinlicher das Du in einen `MemoryError` läufst als das Du in einen `RecursionError` bei einer rekursiven Lösung läufst, aber auch das halte ich schon für recht unwahrscheinlich. Idiotensicher kann ja auch bedeuten, dass man die Grenzen der Implementierung dokumentiert, statt sie versucht unbegrenzt zu gestalten. Wobei sowohl `os.walk()` als auch `pathlib.Path.rglob()` rekursiv gelöst sind, ohne dass das irgendwo in der Dokumentation steht. Und ich habe bis jetzt auch noch nicht gehört, dass damit jemand an das Rekursionslimit gestossen wäre.
Wirklich idiotensicher kann man nichts machen, denn wenn man etwas idiotensicher macht, erfindet das Universun einfach einen noch grösseren Idioten.

Defensiv programmieren ist an sich eine gute Idee, und man sollte ein wenig auf Fallen achten in die man leicht tappen kann, aber ansonsten sollte man schon von mündigen, denkenden Programmierern ausgehen. Das ist Python und nicht Java.
Wenn Du da gerade neuen Code schreibst, würde ich den an Deiner Stelle nicht mehr mit `os` & Co sondern mit `pathlib` schreiben.