Person_ary = ('A'..'D').to_a
["A", "B", "C", "D"]
["AB", "B", "C", "D"]

ttps://paiza.io/
で実行しているが、p で表示すると、
いつの間にか配列の'A'が、'AB'に変わってしまう。
配列に代入している箇所は無い
環境のバグ?

それにそもそも、大文字で始まる変数名は、
定数じゃないのか?

トップレベルで、define_methodを呼び出して、
関数外で定義した配列を、関数内で使っているから?
さらに、この関数は再帰関数なのです

Kernel.send :define_method, :go do |
per_ary, layer=0, total_time=0 |

元の配列を変更しないように、
すべての要素をコピーして、関数に渡しているのですが、
ary2 = Person_ary[0..-1]
go(ary2)