某IT会社のGeekな先輩から出された問題。
問題
以下の制約を守り、Nの階乗(N!)を返すint computeFactorialN(N)
メソッドを実装してください。
制約:if, switch, for, while,
比較演算子は利用不可
正解
たしかにJavaは思いつかない。Boolean型の仕様が厳しい。
ちなみにcomputeFactorialN(0) = 0
になるのと、
すぐint
がオーバーフローするのはドンマイ。
#include <iostream>; static int computeFactorialNotOne(int n); static bool notEqualOne(int n){ return (bool)(n >> 1); } static int computeFactorialOne(int n){ return 1; } static int (*factorials[2])(int) = {computeFactorialOne, computeFactorialNotOne}; static int computeFactorialNotOne(int n){ return n * factorials[notEqualOne(n)](n - 1); } static int computeFactorialN(int n){ return computeFactorialNotOne(n); } int main(){ for(int i = 1; i < 10; i++){ std::cout << "computeFactorialN(" << i << ") = " << computeFactorialN((int)i) << std::endl; } return 0; }
0!=1
の実装はあと2つくらいメソッドを追加すればおっけー。
Javaは0の判断を以下のように行い、メソッドを切り替えればできる
( (n * -1) >>> (Integer.size() - 1) )