#include <stdio.h>
static unsigned indentation = 0;
static void indent(void) { ++indentation; }
static void unindent(void) { --indentation; }
static void IN(void) {
unsigned i = 0;
for (; i < indentation; ++i) {
}
}
unsigned int crazy_factorial(unsigned int const * const n) {
IN
(); printf("crazy-factorial(%u @ %p)\n", *n
, n
); indent();
unsigned int result;
if (*n == 0) {
result = 1;
} else {
unsigned int * const nextN
= malloc(sizeof(unsigned int)); IN
(); printf("allocated memory @ %p\n", nextN
); *nextN = *n - 1;
result = *n * crazy_factorial(nextN);
IN
(); printf("freed %p\n", nextN
); }
IN
(); printf("=> %u\n", result
); unindent();
return result;
}
int main(void) {
unsigned int n = 5;
unsigned int result = crazy_factorial(&n);
printf("crazy_factorial(%u) = %u\n", n
, result
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdGF0aWMgdW5zaWduZWQgaW5kZW50YXRpb24gPSAwOwpzdGF0aWMgdm9pZCBpbmRlbnQodm9pZCkgeyArK2luZGVudGF0aW9uOyB9CnN0YXRpYyB2b2lkIHVuaW5kZW50KHZvaWQpIHsgLS1pbmRlbnRhdGlvbjsgfQpzdGF0aWMgdm9pZCBJTih2b2lkKSB7Cgl1bnNpZ25lZCBpID0gMDsKCWZvciAoOyBpIDwgaW5kZW50YXRpb247ICsraSkgewoJCXByaW50ZigiICA6Iik7Cgl9Cn0KCnVuc2lnbmVkIGludCBjcmF6eV9mYWN0b3JpYWwodW5zaWduZWQgaW50IGNvbnN0ICogY29uc3QgbikgewoJSU4oKTsgcHJpbnRmKCJjcmF6eS1mYWN0b3JpYWwoJXUgQCAlcClcbiIsICpuLCBuKTsKCWluZGVudCgpOwoJdW5zaWduZWQgaW50IHJlc3VsdDsKCWlmICgqbiA9PSAwKSB7CgkJcmVzdWx0ID0gMTsKCX0gZWxzZSB7CgkJdW5zaWduZWQgaW50ICogY29uc3QgbmV4dE4gPSBtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkpOwoJCUlOKCk7IHByaW50ZigiYWxsb2NhdGVkIG1lbW9yeSBAICVwXG4iLCBuZXh0Tik7CgkJKm5leHROID0gKm4gLSAxOwoJCXJlc3VsdCA9ICpuICogY3JhenlfZmFjdG9yaWFsKG5leHROKTsKCQlmcmVlKG5leHROKTsKCQlJTigpOyBwcmludGYoImZyZWVkICVwXG4iLCBuZXh0Tik7Cgl9CglJTigpOyBwcmludGYoIj0+ICV1XG4iLCByZXN1bHQpOwoJdW5pbmRlbnQoKTsKCXJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKHZvaWQpIHsKCXVuc2lnbmVkIGludCBuID0gNTsKCXVuc2lnbmVkIGludCByZXN1bHQgPSBjcmF6eV9mYWN0b3JpYWwoJm4pOwoJcHJpbnRmKCJjcmF6eV9mYWN0b3JpYWwoJXUpID0gJXVcbiIsIG4sIHJlc3VsdCk7CglyZXR1cm4gMDsKfQo=