旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

ばかの再帰

再帰について。

再帰とは

自分を呼び出します。

再帰呼出し(さいきよびだし、英 recursive call)は、プログラミング技法の一つである。
手続きや関数といった概念をもつプログラミング言語では、ある手続き中で再びその手続き自身を呼び出すことを認める場合が多い。これを再帰呼出しといい、階乗計算やフィボナッチ数列のように、本来再帰的な構造をもつアルゴリズム再帰アルゴリズム)を記述するのに適している。
再帰 - Wikipediaより

ちなみにオープンソースのOS、Linuxは"Linux is not unix"の略で、こういうのも再帰的というようです。LinuxLinux再帰的に呼び出してるっていうのかな。頭文字"L"の意味はLinuxのLなんだけど、そのLinuxのLもまたLinuxのLで...んんああああ!って感じですね。

とてもいやらしいループです。

ばかの再帰

この基本的な考え方を理解する為に、小ちゃい子の口喧嘩を表現したいと思いました。

Aくん「ばーか!」
Bくん「ばかっていうやつがばかなんだよ!」
Aくん「ばかっていうやつがばかなんだよ!っていうやつがばかなんだよ!」

たぶんあったと思います。いや、、、あったかな?
まあいいや。たぶんあったはずです。

これをプログラムにするとこんな感じになりました。

f:id:shgam:20131028013143j:plain

言い返し続けるときりがありません。

コード

def say_baka(baka)
  res_to_baka = "#{baka}ッテイウヤツガ#{WORD}ダヨー(^^)"
  puts "\nComputer: #{res_to_baka}"
  print "\n言い返す?(yesで続ける) : "
  yesno = gets.chomp
  if yesno == "yes"
    puts res_to_com = ("#{res_to_baka}っていう奴が#{WORD}だろ!")
    say_baka(res_to_com)
  else
    puts "あんたは賢いよ。"
  end
end

puts "コンピュータに悪口を言おう"
WORD = gets.chomp
say_baka(WORD)

ちゃんと対話っぽくしたいときには間にsleep(2)とか入れる。


こういうの書いてみるといかに自分がプログラム書けないかってことに気付かされます。プログラミングできる人になりたいです。

最近はブログの「プログラミング入門」というタイトルの割に、環境構築とかサービス紹介とかそんなんばっかだったので書いてみました。

また、なんでいきなり再帰について書いたかっていうと、最近進めてるプログラミングコンテストの定番の本(らしい)いわゆる"蟻本"でまっさきに紹介されていたのが再帰呼び出しについてだったからです。