#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] %d <- return func(%d)\n", stack
, 0, n
); return 0;
}
if(n==1) {
indent
(stack
); printf("[Y%d] %d <- return func(%d)\n", stack
, 1, n
); return 1;
}
indent
(stack
); printf("[L%d] call func(%d-2)\n", stack
, n
); int i_ret1 = func(n-2, stack);
indent
(stack
); printf("[A%d] %d <- func(%d-2)\n", stack
, i_ret1
, n
);
indent
(stack
); printf("[R%d] call func(%d-1)\n", stack
, n
); int i_ret2 = func(n-1, stack);
indent
(stack
); printf("[B%d] %d <- func(%d-1)\n", stack
, i_ret2
, n
);
indent
(stack
); printf("[Y%d] %d <- return func(%d-2) + func(%d-1)\n", stack
, i_ret1
+ i_ret2
, n
, n
); return(i_ret1 + i_ret2);
}
#define X 4
int main() {
printf("[%d] call func(%d)\n", 0, X
); int i_ret = func(X, 0);
printf("[%d] %d <- func(%d)\n", 0, i_ret
, X
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp2b2lkIGluZGVudChpbnQgbikgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHByaW50ZigiICAgICIpOwp9CgppbnQgZnVuYyhpbnQgbiwgaW50IHN0YWNrKSB7CgoJKytzdGFjazsKCQoJaWYobj09MCkgewoJCWluZGVudChzdGFjayk7IHByaW50ZigiW1klZF0gJWQgPC0gcmV0dXJuIGZ1bmMoJWQpXG4iLCBzdGFjaywgMCwgbik7CgkJcmV0dXJuIDA7Cgl9CglpZihuPT0xKSB7CgkJaW5kZW50KHN0YWNrKTsgcHJpbnRmKCJbWSVkXSAlZCA8LSByZXR1cm4gZnVuYyglZClcbiIsIHN0YWNrLCAxLCBuKTsKCQlyZXR1cm4gMTsKCX0KCglpbmRlbnQoc3RhY2spOyBwcmludGYoIltMJWRdIGNhbGwgZnVuYyglZC0yKVxuIiwgc3RhY2ssIG4pOwoJaW50IGlfcmV0MSA9IGZ1bmMobi0yLCBzdGFjayk7CglpbmRlbnQoc3RhY2spOyBwcmludGYoIltBJWRdICVkIDwtIGZ1bmMoJWQtMilcbiIsIHN0YWNrLCBpX3JldDEsIG4pOwoKCWluZGVudChzdGFjayk7IHByaW50ZigiW1IlZF0gY2FsbCBmdW5jKCVkLTEpXG4iLCBzdGFjaywgbik7CglpbnQgaV9yZXQyID0gZnVuYyhuLTEsIHN0YWNrKTsKCWluZGVudChzdGFjayk7IHByaW50ZigiW0IlZF0gJWQgPC0gZnVuYyglZC0xKVxuIiwgc3RhY2ssIGlfcmV0Miwgbik7CgoJaW5kZW50KHN0YWNrKTsgcHJpbnRmKCJbWSVkXSAlZCA8LSByZXR1cm4gZnVuYyglZC0yKSArIGZ1bmMoJWQtMSlcbiIsIHN0YWNrLCBpX3JldDEgKyBpX3JldDIsIG4sIG4pOwoJcmV0dXJuKGlfcmV0MSArIGlfcmV0Mik7Cn0KCiNkZWZpbmUgWCA0CgppbnQgbWFpbigpIHsKCXByaW50ZigiWyVkXSBjYWxsIGZ1bmMoJWQpXG4iLCAwLCBYKTsKCWludCBpX3JldCA9IGZ1bmMoWCwgMCk7CglwcmludGYoIlslZF0gJWQgPC0gZnVuYyglZClcbiIsIDAsIGlfcmV0LCBYKTsKCXJldHVybiAwOwp9Cg==