12 计算阶乘, for 和 递归

//
#include    <stdio.h>

int get_input(void);
int fac(int);
int fac2(int);
main()
{
    int input;
    int ans;
    int ans2;
    printf("This progame calculates  factorial.\n");
    printf("Please Input a number :\n");
    input = get_input();
    ans = fac(input);
    ans2 = fac2(input);
    if (ans==-1)
        printf("Calculate the factorial of %d ?  Are you sure?\n", input);
    else
    printf("The factorial of %d is %d\n", input, ans);
    printf("The factorial of %d is %d\n", input, ans2);
}

int get_input(void)
{
    int input;
    char ch;

    while (scanf_s("%d", &input) != 1)
    {
        while ((ch = getchar()) != '\n')
            putchar(ch);

        printf(" is Not a number\n");
        printf("Input again:");
    }
    return input;
}

    int fac(int n) {
            int res = 1;
            int i;
        
            if (n <= 0)
                res = -1;

            for (i = 1;i <= n;i++)
                res *= i;
    
        return res;
    }
    int fac2(int n) {
        int res;
        if (n > 1)
            res = fac2(n - 1) * n;
        else
            res = 1;
    
        return res;
    }

 

分析下: 

    int fac2(int n) {
        int res;
        if (n > 1)
            res = fac2(n - 1) * n;
        else
            res = 1;
    
        return res;
    }

假设计算 fac2(4):

main()把n=4 传进来 
计算fec2(4) res
if (n > 1)              //   4>1
res = fac2(4 - 1) * 4;  // fac2(4) res=fac2(3)*4,先计算fac2(3),等会再回来*4    (3)

计算fec2(3) res
if (n > 1)              //   3>1
res = fac2(3 - 1) * 4;  // fac2(3) res=fac2(2)*4, 先计算fac2(2),等会再回来*3    (2)

计算fec2(2) res
if (n > 1)              //   2>1
res = fac2(2 - 1) * 4;  // fac2(3) res=fac2(1)*4,先计算fac2(1),等会再回来*2    (1)

计算fec2(1) res
if (n > 1)              //   1>1  False
res = fac2(n - 1) * n;    //不执行
else
 res = 1;               // 执行 1赋给res

 ok, (3)(2)(1)只是执行了一半,现在可以执行了, (1) res=1*2 , (2) res=1*2*33) res=1*2*4 

 



 

posted @ 2020-05-27 15:18  abel2020  阅读(238)  评论(0编辑  收藏  举报