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*3 (3) res=1*2*4