ネタ元 →
ぱぱっと書かせるプログラムの問題
出題条件を早とちりして、勝手にハマってしまった私が居ます...orz:
n=0 => TRUE
n=1 => False と誤認してしまって、投稿してました。
みなさんのエレガントさには及びませんが、再掲載
'========仕様誤読によるダメ版
Private Function is2累乗(ByVal n As Long) As Boolean
If n = 0 Then Return True
Static nest As Integer = 0
Dim rc As Boolean = False
Try
nest += 1
If nest = 1 AndAlso n = 1 Then Return False
If nest > 1 AndAlso n = 1 Then Return True
If n Mod 2 = 1 Then Return False
If n = 1 AndAlso n Mod 2 = 0 Then Return True
Return is2累乗(n \ 2)
Catch ex As Exception
Finally
nest -= 1
End Try
Return rc
End Function
n=1 の時の処理を Falseにしたいが為に、 再帰レベルを捕捉して、再帰解消判定と兼ねさせました。泥臭くなって....(^^
良く確認したら 2^n なんで、 1はTrueで 0はFalse です。
Private Function is2累乗_新(ByVal n As Long) As Boolean
If n = 0 Then Return False
If n = 1 Then Return True
If n Mod 2 = 1 Then Return False
Return is2累乗_新(n \ 2)
End Function
これで、いいやん、何を自分で墓穴をほったのだろう...orz;
再帰の教育用テーマにいいですね。
いやぁ、パパッと作ると、完成度が低くなるという実例でした <-- オイ!!
ふと....2^(-n)の判定はできるのだろうか、0.125 はスッキリだが、 0.124は半端なであるのをアプリ自身が認識できるのかなぁ..