>Я успокоился. Обострение закончилось
Не закончилось - всё обо что я ломал голову было найдено на
http://dtm.livejournal.com/36832.html
Что-ж, "мы пойдём другим путём..." =)
class Y<R,T> extends F<F<R, T>, F<F<R, T>, F<R, T>>> {
abstract class Branch extends F<F<R, T>, Branch>{
public abstract F<R, T> apply(Branch arg);
};
public F<R, T> apply(final F<F<R, T>, F<R, T>> f) {
return new Branch() {
public F<R, T> apply(final Branch rec) {
return f.apply(new F<R, T>() {
public R apply(T x) {
return (rec).apply(rec).apply(x);
}
});
}
}.apply(new Branch() {
public F<R, T> apply(final Branch rec) {
return f.apply(new F<R, T>() {
public R apply(T x) {
return (rec).apply(rec).apply(x);
}
});
}
});
}
}
class AckY extends F<F<F<Long,Long>,Long>,F<F<Long,Long>,Long>> {
public F<F<Long,Long>,Long> apply(final F<F<Long,Long>,Long> f) {
return new F<F<Long,Long>,Long>() {
public F<Long,Long> apply(final Long m) {
return new F<Long,Long>() {
public Long apply(Long n) {
if (m==0) return n+1;
if (n==0) return f.apply(m-1).apply((long)1);
return f.apply(m-1).apply(f.apply(m).apply(n-1));
}
};
};
};
}
}
// A(3,4)=125
final static long m = 3;
final static long n = 4;
System.out.print("Ackerman(" + m + "," + n + ")==" +
(new Y<F<Long,Long>,Long>()).apply(new AckY()).apply(m).apply(n) + "\n");