Posted at

再帰関数 初めの一歩

More than 1 year has passed since last update.

「RubyでつくるRuby」を読んでいて

普通に再帰関数が出てきたので自分なりに

一度整理してみる。

率直に言って私は再帰関数が苦手です。

なんとなく言わんとしていることはわかるのですが、

コードを読むのが凄く疲れるんです。

たぶん、眉間にしわが寄っていると思う。

今まで関わってきたプロジェクトで一度も

再帰関数を見たことがないっていうのもあって

免疫自体がないのかもしれません。


再帰関数とは

関数の中から自分自身の関数を呼び出す処理を行う関数

自分の中から自分を呼び出すので連続する同じような

処理とかに向いていると思われる。

そのため、個人的には使いどころが難しいと思う。

本ではTree構造のデータに対して使用していたので

条件が合えばJSON、XMLでも使用できるかなと思う。


例)複利計算

何か単純な例がないか考えた結果・・・

みなさん、お金好きですよね?

お金が湧かないかなと思ったことありますよね?

例として複利計算を行おうと思います。

投資や借金、ローンなどで聞いたことがあるかもしれませんが、

複利とは元金(がんきん)によって生じた利子を次期の元金に

組み入れる方式で、元金だけでなく利子にも次期の利子がつく仕組みです。

例)

元金100円、利率が5%、期間が1年で運用した場合の元金は

100 * 1.05 = 105

元金100円、利率が5%、期間が2年運用した場合の元金は

(100 * 1.05) * 1.05 = 110.25

元金100円、利率が5%、期間が3年運用した場合の元金は

((100 * 1.05) * 1.05) * 1.05 = 115.7625


while

# パーセント

def percent(year_rate)
year_rate.to_f / 100.to_f
end

# 複利関数(元金,年利(%),年数)
def fukuri(principal, year_rate, year)
while year > 0
principal *= (1 + percent(year_rate))
year -= 1
end
principal
end

p fukuri(100, 5, 3)
115.7625


再帰関数

# パーセント

def percent(year_rate)
year_rate.to_f / 100.to_f
end

# 複利関数(元金,年利(%),年数)
def fukuri(principal, year_rate, year)
return principal if year.zero?
fukuri(principal * (1 + percent(year_rate)), year_rate, year - 1)
end

p fukuri(100, 5, 3)
115.7625


感想

複利で運用した場合の元金を求める関数を

whileを使った場合、再帰関数を使った場合を

比較のため書いてみました。

学習の一環として無理やり再帰関数を

使ってみましたがどうですかね?

具体例が悪すぎるという可能性は高いですが、

個人的には単純な処理ほど再帰関数を

使用するメリットは得られませんでした。

今回だと処理の行数が減ったぐらいなのかな。

見やすくなったかは個人的には微妙です。

初めの一歩ですので、こんなものかな。

次回、二歩目があるかわかりませんが、

あればもうちょい複雑な処理を再帰関数に

して、今回よりもメリットを感じられれば良いかなと

思っています。