//
// stack, array, static node, recursive
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long long int recursive1(long long int n) {
if (n == 0)
return n;
//printf("%zd\n",n);
return n + recursive1(n-1);
}
//========================================================//
long long int recursive2(int n) {
size_t current;
size_t length;
struct node {
long int n;
int step;
};
static struct node nodes[64000000];
struct node node;
long long int rvalue;
length = 0;
current = 0;
node.n = n;
node.step = 0;
//rvalue = 0;
nodes[length] = node;
length++;
while (length > 0) {
current = length-1;
if (nodes[current].step == 0) {
if (nodes[current].n == 0) {
rvalue = 0;
length--;
continue;
}
//printf("%ld\n", nodes[current].n);
nodes[length - 1].step++;
nodes[length].n = nodes[current].n - 1;
nodes[length].step = nodes[current].step - 1;
length++;
} else if (nodes[current].step == 1) {
rvalue += nodes[current].n;
length--;
}
}
return rvalue;
}
//========================================================//
int main(void) {
//printf("recursive1(): %lld;\n\n", recursive1(50000000));
printf("recursive2(): %lld;\n\n", recursive2
(50000000));
return 0;
}
Ly8KLy8gc3RhY2ssIGFycmF5LCBzdGF0aWMgbm9kZSwgcmVjdXJzaXZlCi8vCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmxvbmcgbG9uZyBpbnQgcmVjdXJzaXZlMShsb25nIGxvbmcgaW50IG4pIHsKICAgIGlmIChuID09IDApCiAgICAgICAgcmV0dXJuIG47CiAgICAKICAgIC8vcHJpbnRmKCIlemRcbiIsbik7CiAgICByZXR1cm4gbiArIHJlY3Vyc2l2ZTEobi0xKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgpsb25nIGxvbmcgaW50IHJlY3Vyc2l2ZTIoaW50IG4pIHsKICAgIHNpemVfdCBjdXJyZW50OwogICAgc2l6ZV90IGxlbmd0aDsKICAgICAKICAgIHN0cnVjdCBub2RlIHsKICAgICAgICBsb25nIGludCBuOwogICAgICAgIGludCBzdGVwOwogICAgfTsKICAgIAogICAgc3RhdGljIHN0cnVjdCBub2RlIG5vZGVzWzY0MDAwMDAwXTsKICAgIHN0cnVjdCBub2RlIG5vZGU7ICAgICAgICAKICAgIAogICAgbG9uZyBsb25nIGludCBydmFsdWU7CgogICAgbGVuZ3RoID0gMDsKICAgIGN1cnJlbnQgPSAwOwogIAogICAgbm9kZS5uID0gbjsKICAgIG5vZGUuc3RlcCA9IDA7CiAgICAvL3J2YWx1ZSA9IDA7CgogICAgbm9kZXNbbGVuZ3RoXSA9IG5vZGU7CiAgICBsZW5ndGgrKzsKCiAgICB3aGlsZSAobGVuZ3RoID4gMCkgewogICAgICAgIGN1cnJlbnQgPSBsZW5ndGgtMTsKICAgICAgICBpZiAobm9kZXNbY3VycmVudF0uc3RlcCA9PSAwKSB7CiAgICAgICAgICAgIGlmIChub2Rlc1tjdXJyZW50XS5uID09IDApIHsKICAgICAgICAgICAgICAgIHJ2YWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBsZW5ndGgtLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3ByaW50ZigiJWxkXG4iLCBub2Rlc1tjdXJyZW50XS5uKTsKCiAgICAgICAgICAgIG5vZGVzW2xlbmd0aCAtIDFdLnN0ZXArKzsKCiAgICAgICAgICAgIG5vZGVzW2xlbmd0aF0ubiA9IG5vZGVzW2N1cnJlbnRdLm4gLSAxOwogICAgICAgICAgICBub2Rlc1tsZW5ndGhdLnN0ZXAgPSBub2Rlc1tjdXJyZW50XS5zdGVwIC0gMTsKICAgICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgfSBlbHNlIGlmIChub2Rlc1tjdXJyZW50XS5zdGVwID09IDEpIHsKICAgICAgICAgICAgcnZhbHVlICs9IG5vZGVzW2N1cnJlbnRdLm47CiAgICAgICAgICAgIGxlbmd0aC0tOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBydmFsdWU7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwoKaW50IG1haW4odm9pZCkgewoKICAgIC8vcHJpbnRmKCJyZWN1cnNpdmUxKCk6ICVsbGQ7XG5cbiIsIHJlY3Vyc2l2ZTEoNTAwMDAwMDApKTsKICAgIHByaW50ZigicmVjdXJzaXZlMigpOiAlbGxkO1xuXG4iLCByZWN1cnNpdmUyKDUwMDAwMDAwKSk7CgogICAgcmV0dXJuIDA7Cn0K