You're recursion isn't terminating fast enough, so you're blowing your stack.
To get around this, just make it a loop, it doesn't look like you're actually doing anything that needs recursion.
I think this does it:
void solver(double t, double z, double w, double i) {
while (!(t >= tf)) {
printf("%f %f %f\n", z, w, i);
dzdt = w;
dwdt = 1/J*( Ka*i - ko*z - bo*w );
didt = 1/L*( E - R*i - Kb*w );
// Solve next step with newly calculated "initial conditions"
t = t+h;
z = z+h*dzdt;
w = w+h*dwdt;
i = i+h*didt;
}
printf("Finished!\n");
}
As a side note, your function is eligible for tail recursion optimizations, so if you compile it with some optimizations turned on (-O2 for example), any decent compiler will actually be smart enough to make that a tail recursive call, and your program will not segfault.