#include <stdio.h>

int   stack [1000];
int sp=0; 
int  pop(){
    sp=sp-1;
    return stack[sp];
}
void push(int x){
    stack[sp]=x;
    sp=sp+1;
}

int get(int i){
    return stack[sp-1-i];
}



int facRec(){
    if (get(0)==0) return 1;
    int _1 = get(0);
    push(_1-1);
    int erg=facRec();
    pop();
    return _1*erg;

}

int facRec3(int result,int i){
 anfang:
    if (i==0) return result;
//     return facRec3(result*i,i-1);
      result=result*i;
    i=i-1;
    goto anfang;
}

int facRec2(int i){
    return facRec3(1,i);
}

int facIter(int i){
    int result=1;
    //while(i>0){

 schleifenanfang:
    if (!(i>0)) goto schleifenende; 
    result=i*result;
    i=i-1;
    goto schleifenanfang;
 schleifenende:
	//}
    return result;
}

int main(){
    push(5);
    int erg = facRec();
    pop();
    printf("%d,%d,%d\n",erg,facRec2(5),facIter(5));
    return 0;
}
