#include <stdio.h>
void indent(int n) {
for (int i
= 0; i
< n
; ++i
) printf(" "); }
int func(int n, int stack)
{
++stack;
if(n==0) {
indent
(stack
); printf("[Y%d] returned func(%d) -> %d\n", stack
, n
, 0); return 0;
}
if(n==1) {
indent
(stack
); printf("[Y%d] returned func(%d) -> %d\n", stack
, n
, 1); return 1;
}
indent
(stack
); printf("[L%d] call func(%d-2)\n", stack
, n
); int i_ret1 = func(n-2, stack);
indent
(stack
); printf("[R%d] call func(%d-1)\n", stack
, n
); int i_ret2 = func(n-1, stack);
indent
(stack
); printf("[Y%d] returned func(%d-2) + func(%d-1) -> %d\n", stack
, n
, n
, i_ret1
+ i_ret2
); return(i_ret1 + i_ret2);
}
int main()
{
printf("[%d] call func(%d)\n", 0, 4); int i_ret = func(4, 0);
printf("[%d] returned func(%d) -> %d\n", 0, 4, i_ret
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp2b2lkIGluZGVudChpbnQgbikgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHByaW50ZigiICIpOwp9CgppbnQgZnVuYyhpbnQgbiwgaW50IHN0YWNrKQp7CgkrK3N0YWNrOwoJaWYobj09MCkgewoJCWluZGVudChzdGFjayk7IHByaW50ZigiW1klZF0gcmV0dXJuZWQgZnVuYyglZCkgLT4gJWRcbiIsIHN0YWNrLCBuLCAwKTsKCQlyZXR1cm4gMDsKCX0KCWlmKG49PTEpIHsKCQlpbmRlbnQoc3RhY2spOyBwcmludGYoIltZJWRdIHJldHVybmVkIGZ1bmMoJWQpIC0+ICVkXG4iLCBzdGFjaywgbiwgMSk7CgkJcmV0dXJuIDE7Cgl9CgoJaW5kZW50KHN0YWNrKTsgcHJpbnRmKCJbTCVkXSBjYWxsIGZ1bmMoJWQtMilcbiIsIHN0YWNrLCBuKTsKCWludCBpX3JldDEgPSBmdW5jKG4tMiwgc3RhY2spOwoJaW5kZW50KHN0YWNrKTsgcHJpbnRmKCJbUiVkXSBjYWxsIGZ1bmMoJWQtMSlcbiIsIHN0YWNrLCBuKTsKCWludCBpX3JldDIgPSBmdW5jKG4tMSwgc3RhY2spOwoJaW5kZW50KHN0YWNrKTsgcHJpbnRmKCJbWSVkXSByZXR1cm5lZCBmdW5jKCVkLTIpICsgZnVuYyglZC0xKSAtPiAlZFxuIiwgc3RhY2ssIG4sIG4sIGlfcmV0MSArIGlfcmV0Mik7CglyZXR1cm4oaV9yZXQxICsgaV9yZXQyKTsKfQoKaW50IG1haW4oKQp7CglwcmludGYoIlslZF0gY2FsbCBmdW5jKCVkKVxuIiwgMCwgNCk7CglpbnQgaV9yZXQgPSBmdW5jKDQsIDApOwoJcHJpbnRmKCJbJWRdIHJldHVybmVkIGZ1bmMoJWQpIC0+ICVkXG4iLCAwLCA0LCBpX3JldCk7CglyZXR1cm4gMDsKfQ==