am-kernels/cpu-tests/tests/recursion.c
2020-08-11 17:38:42 +00:00

46 lines
837 B
C

#include "trap.h"
int f0(int, int);
int f1(int, int);
int f2(int, int);
int f3(int, int);
int (*func[])(int, int) = {
f0, f1, f2, f3,
};
int rec = 0, lvl = 0;
int f0(int n, int l) {
if (l > lvl) lvl = l;
rec ++;
return n <= 0 ? 1 : func[3](n / 3, l + 1);
};
int f1(int n, int l) {
if (l > lvl) lvl = l;
rec ++;
return n <= 0 ? 1 : func[0](n - 1, l + 1);
};
int f2(int n, int l) {
if (l > lvl) lvl = l;
rec ++;
return n <= 0 ? 1 : func[1](n, l + 1) + 9;
};
int f3(int n, int l) {
if (l > lvl) lvl = l;
rec ++;
return n <= 0 ? 1 : func[2](n / 2, l + 1) * 3 + func[2](n / 2, l + 1) * 2;
};
int ans[] = {38270, 218, 20};
int main() {
int x = func[0](14371, 0);
nemu_assert(x == ans[0]); // answer
nemu_assert(rec == ans[1]); // # recursions
nemu_assert(lvl == ans[2]); // max depth
return 0;
}