大学3年生による、自然数のケタ数求め

ある自然数が変数nに入っている。nは何桁の数かを求めるプログラムを書け。

自然数の桁数 - 日記を書く [・w・] はやみずさん のところで書かれていた内容↑
を見て、真っ先に考えた内容が、以下のコード。

ketasu(int n){
  int i;
  for(i=0; n>0; i++)
    n /= 10;
  return i;
}

しかしこんなコードを載せた日にはもう何らかの意味で敗北したようなものである。
はやみずさんの記事に載っているコードは全て一行で、処理が一瞬で分かるほど見た目が良い。それに対してこのコードは実に無様。int i;という宣言がまず無様だ(あっやばい動的型付け言語に感覚が汚染されてる)。
それより何よりこのアルゴリズムが面白くも何ともない。10で繰り返し割っていくだけ。実にストレート。
アルゴリズムは変えようがないにしても、ちょっとした小細工を施すことで見た目を取り繕おうと思い、

(defun ketasu (num)
  (if (>= num 1)
      (+ (ketasu (/ num 10))
         1)
      0))

今日、Common Lispで書いてみた。


はやみずさんの記事のコメントを見ると、なんでもlogでやるのは何かしらの問題があるらしい。10で繰り返し割っていくという方法は、意外にも決して冗長というわけではなかったみたい。


こうやってC系言語とCommon Lispを両方書いてみると、確かに色々違うんだなと肌で感じる。
プログラミング言語はプログラムを記述する言語だという側面と、思考の仕方を決める道具だという考え方とでは、やはり思考の仕方を決めるという効果の方が大きいと思う。
プログラミングパラダイムは良いね。プログラミングパラダイムは心を潤してくれる。