/* * NFACT -- compute a factorial recursively * * Usage: nfact * * Inputs: integer n * Outputs: n! = f * Errors: n < 0 * * Assumptions: - the arguments are not digits followed by non-digits * (unchecked) * - n >= 0 (checked) * * Matt Bishop, ECS 36A * * October 17, 2019 -- wrote original version */ #include /* * NFACT -- compute the factorial of n recursively * Parameters: n non-negative integer * Returns: n! * Assumptions: - n is non-negative integer (not checked) * Algorithm: n! = n(n-1)! */ int nfact(int n) { /* base case: 0! = 1 */ if (n == 0) return(1); /* recursive case: n! = n * (n-1)! */ return(n * nfact(n - 1)); } /* * main ro */ int main(void) { int rv; /* success of failure of read */ int ch; /* character to discard */ int n; /* number to compute the factorial of */ int badct = 0; /* number of bad arguments */ /* * loop through the argument list */ printf("> "); while((rv = scanf("%d", &n)) != EOF){ if (rv != 1){ fprintf(stderr, "Invalid input\n"); /* discard the rest of the line */ while((ch = getchar()) != '\n' && ch != EOF) ; /* quit on EOF; loop on error */ if (ch == EOF) return(badct); badct++; printf("> "); continue; } else if (n < 0) /* check it is non-negative, balk if not */ fprintf(stderr, "%d: need a non-negative integer\n", n); else /* compute and print the factorial */ printf("%d! = %d\n", n, nfact(n)); printf("> "); } /* * return exit code of the number of failures */ return(badct); }