// f(f(f(f(...f(x)...)))) を計算する (fをn回繰り返す)
//---------------------------------------
// 型定義&プロトタイプ宣言
typedef int data_t;          // 任意のデータ型
typedef data_t (*func_t) (data_t); // 一引数関数
data_t call_n_times (int n, func_t f, data_t x);
//---------------------------------------
// 関数定義
int cond_lt (int a, int b) { return ((a-b)>>31)&1; }
data_t call0 (int n, func_t f, data_t x) { return x; }
data_t call1 (int n, func_t f, data_t x) { return f (x); }
data_t call2ormore (int n, func_t f, data_t x) {
 return call_n_times (n/2, f, call_n_times (n-n/2, f, x));
}
data_t call_n_times (int n, func_t f, data_t x) {
 data_t (*table[3]) (int, func_t, data_t) = {
  call0, call1, call2ormore
 };
 return (*table[cond_lt(0,n) + cond_lt(1,n)]) (n, f, x);
}
//-----------------------------------
// 使い方サンプル:1〜100000を表示する
#include <stdio.h>

data_t print_and_increment (data_t x) {
 printf ("%d\n", x); return x+1; 
}
int main (int argc, char** argv) {
 call_n_times (100000, print_and_increment, 1);
 return 0; 
}