[ques]use recursive function to print out n!

Discussion in 'C Programming' started by action!, Nov 6, 2005.

  1. action!

    action! Guest

    this is my C Programming homework,

    It wants me to input 10! and output the follow result

    10!
    ¡õ
    10 * 9!
    ¡õ
    9 * 8!
    ..................
    2* 1!
    ¡õ
    1

    I take it for decreasing by degress, so using two for() loop to execute..
    but I spend two days to try and can not figure out what the problem is.

    Could anybody show me a hint with this ? thank you so much.

    I use the compiler with dec C++ to finish the C programming follow
    ----------------------------------------------------------------------------
    #include <stdio.h>
    #include <stdlib.h>

    long fact(int num);
    int main(void)
    {
    int i,j; /* counter */
    int ans = 1;
    printf("Input the n!:");
    scanf("%d", &i);

    for(i=10;i>=1;i--)
    {
    for(j=9;j>=0;j--)
    {
    ans *= j;
    printf("%d * %2d! = %d\n",i, j, i*j );

    }
    printf("\n");
    }
    system("pause");
    return 0;
    }
    /* Recursive fonction */
    long fact(int num)
    {
    if(num<=1){
    return 1;
    }
    else{
    return (num * fact(num-1));
    }
    }

    --
    ¢~¢w¢w¢w¢w¢¡ ùá weiyu.csie.net ùá ¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸
    ¢x¤ýªÌ¤§®a¢x ùá keith ¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸
    ¢¢¢w¢w¢w¢w¢£ ùá µoªí©ó 140.120.238.173 ¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸¡¸
    action!, Nov 6, 2005
    #1
    1. Advertising

  2. action!

    AK Guest

    Hi

    This is quite easy. You don't need 2 for-loops for that.

    action! wrote:
    > this is my C Programming homework,
    >
    > It wants me to input 10! and output the follow result
    >
    > 10!
    > ↓
    > 10 * 9!
    > ↓
    > 9 * 8!
    > ..................
    > 2* 1!
    > ↓
    > 1
    >
    > I take it for decreasing by degress, so using two for() loop to execute..
    > but I spend two days to try and can not figure out what the problem is.
    > Could anybody show me a hint with this ? thank you so much.


    When you get questions like this, keep in mind that all the elements
    need not be put in a single loop.
    Some of them maybe formaing a series while others have to be done
    seperately.
    In your case, the first 10! can be done seperately. The rest forms a
    series, as
    10!, (10-1)!
    9!, (9-1)!
    .....
    ......
    .........
    1!,(1-1)!
    Since you already have a recursive function to computer the factorial
    of a number called fact(), you could use a single for loop to do the
    series.

    Hope you get the idea. If not, please feel free to contact me.

    Regards
    AK
    Owner
    Programmer's HQ
    http://groups.google.com/group/programhq
    AK, Nov 7, 2005
    #2
    1. Advertising

  3. action!

    Denis H. G. Guest

    (action!) writes:

    > this is my C Programming homework,
    >
    > It wants me to input 10! and output the follow result
    >
    > 10!
    > ↓
    > 10 * 9!
    > ↓
    > 9 * 8!
    > ..................
    > 2* 1!
    > ↓
    > 1
    >
    > I take it for decreasing by degress, so using two for() loop to execute..
    > but I spend two days to try and can not figure out what the problem is.
    >
    > Could anybody show me a hint with this ? thank you so much.
    > [snippet]


    Basically, you don't need a "for" loop if you employ a recursive function like the "fact()"
    defined in your code. Therefore, what you want is simply as follows:

    --- begin here

    #include <stdio.h>
    #include <stdlib.h>

    long fact(int num);
    int main(void)
    {
    int i; /* counter */
    printf("Input the n!:");
    scanf("%d", &i);

    fact(i);

    }
    /* Recursive fonction */
    long fact(int num)
    {
    if(num<=1){
    return 1;
    }
    else{
    printf("%d!\n|\n%d x (%d-1)!\n", num, num, num);
    return (num * fact(num-1));
    }
    }

    --- end here

    --
    Denis H. G.
    Denis H. G., Nov 7, 2005
    #3
  4. action!

    Chad Guest

    Denis H. G. wrote:
    > (action!) writes:
    >
    > > this is my C Programming homework,
    > >
    > > It wants me to input 10! and output the follow result
    > >
    > > 10!
    > > ↓
    > > 10 * 9!
    > > ↓
    > > 9 * 8!
    > > ..................
    > > 2* 1!
    > > ↓
    > > 1
    > >
    > > I take it for decreasing by degress, so using two for() loop to execute...
    > > but I spend two days to try and can not figure out what the problem is.
    > >
    > > Could anybody show me a hint with this ? thank you so much.
    > > [snippet]

    >
    > Basically, you don't need a "for" loop if you employ a recursive function like the "fact()"
    > defined in your code. Therefore, what you want is simply as follows:
    >
    > --- begin here
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    >
    > long fact(int num);
    > int main(void)
    > {
    > int i; /* counter */
    > printf("Input the n!:");
    > scanf("%d", &i);
    >
    > fact(i);
    >
    > }
    > /* Recursive fonction */
    > long fact(int num)
    > {
    > if(num<=1){
    > return 1;
    > }
    > else{
    > printf("%d!\n|\n%d x (%d-1)!\n", num, num, num);
    > return (num * fact(num-1));
    > }
    > }
    >
    > --- end here
    >
    > --
    > Denis H. G.


    I was also thinking the same thing. I did the following. HOWEVER,
    scanf() still has to checked for 'funky input chars'. I had no idea how
    to do this. I suppose I could have thought about it, but I was too
    lazy.

    -------------------ans.c--------------------------------------------------
    #include <stdio.h>
    #include <stdib.h>

    int fact(int);

    int fact(int num) {
    if(num(<=1){
    return 1;
    }
    else {
    printf("%d! * %d! \n",num,num-1);
    }

    }

    int main(void) {
    int i = 0;
    printf("Input the n! \n");
    scanf("%d! \n", &i);
    fact(i);
    return 0;
    }

    -----------------------------------------------------------------------------

    Chad
    Chad, Nov 7, 2005
    #4
  5. action!

    Ian Malone Guest

    Chad wrote:

    > I was also thinking the same thing. I did the following. HOWEVER,
    > scanf() still has to checked for 'funky input chars'. I had no idea how
    > to do this. I suppose I could have thought about it, but I was too
    > lazy.
    >


    > #include <stdio.h>
    > #include <stdib.h>
    >


    >
    > int main(void) {
    > int i = 0;
    > printf("Input the n! \n");
    > scanf("%d! \n", &i);
    > fact(i);
    > return 0;
    > }
    >



    $ man scanf:
    `scanf' returns the number of input fields successfully scanned, con-
    verted and stored; the return value does not include scanned fields
    which were not stored.

    => Ans: check the return value is equal to one. Check the return values
    of functions.

    Check the return values of functions.

    Note that if scanf stops scanning then the remaining characters on input
    are still waiting to be read. So if scanf stops there will still be
    input waiting and you have to worry about that if you want to read
    anything else in. E.g. your format string will read the number entered,
    but if the next character is not a '!' it will be left waiting on the
    input buffer. Similarly for ' ' and '\n' after it. OTOH "%d%*s" will
    pick up the number and eat the rest of the string until the end of the
    input buffer.

    Check the return values of functions.

    --
    imalone
    Ian Malone, Nov 7, 2005
    #5
  6. action!

    AK Guest

    Hi
    action! wrote:
    > this is my C Programming homework,
    >
    > It wants me to input 10! and output the follow result
    >
    > 10!
    > ↓
    > 10 * 9!
    > ↓
    > 9 * 8!
    > ..................
    > 2* 1!
    > ↓
    > 1


    So, do you want to display this excactly the way it is written here??
    If so, I misunderstood the program as I thought you need to compute
    the value of each factorial.

    > I take it for decreasing by degress, so using two for() loop to execute..
    > but I spend two days to try and can not figure out what the problem is.
    >
    > Could anybody show me a hint with this ? thank you so much.
    >
    > I use the compiler with dec C++ to finish the C programming follow
    > ----------------------------------------------------------------------------


    I suppose you meant dev C++

    <snipped>

    > /* Recursive fonction */
    > long fact(int num)
    > {
    > if(num<=1){
    > return 1;
    > }
    > else{
    > return (num * fact(num-1));
    > }
    > }
    >


    Why do you need this fact()?? This is a function to computer factorial
    of a number. Actually, this is what made me misunderstand your
    question.

    What I see now, is that your assignment doesn't need recursion at all.
    It can be simply done like this :
    ////////////////////////////////////////////
    printf ( " \n 10! " ) ;

    for ( i = 10; i > 1; i -- )
    { printf ( "\n %d * %d ! ", i, i-1 ) ;
    /* I don't know how to print that arrow you have shown. So, replace
    this comment
    by the printf() for the arrow
    */

    printf ( " \n 1 " ) ;
    //////////////////////////////////////////////

    If recursion is compulsory, here it goes :

    ////////////////////////////////////
    printf ( " \n 10! " ) ;

    fact ( ) ;

    printf ( " \n 1 " ) ;
    //////////////////////////////////////
    void fact ( )
    { static int i = 10;
    if ( i > 1 )
    {
    printf ( "\n %d * %d ! ", i, i-1 ) ;
    /* I don't know how to print that arrow you have shown. So, replace
    this comment
    by the printf() for the arrow
    */
    fact ( ) ;
    }
    }
    ///////////////////////////////////////

    Regards
    AK
    Owner
    Programmer's HQ
    http://groups.google.com/group/programhq
    AK, Nov 7, 2005
    #6
  7. action!

    AK Guest

    Chad wrote:
    > Denis H. G. wrote:
    > > (action!) writes:
    > >
    > > > this is my C Programming homework,
    > > >
    > > > It wants me to input 10! and output the follow result
    > > >
    > > > 10!
    > > > ↓
    > > > 10 * 9!
    > > > ↓
    > > > 9 * 8!
    > > > ..................
    > > > 2* 1!
    > > > ↓
    > > > 1
    > > >
    > > > I take it for decreasing by degress, so using two for() loop to execute..
    > > > but I spend two days to try and can not figure out what the problem is.
    > > >
    > > > Could anybody show me a hint with this ? thank you so much.
    > > > [snippet]

    > >
    > > Basically, you don't need a "for" loop if you employ a recursive function like the "fact()"
    > > defined in your code. Therefore, what you want is simply as follows:
    > >
    > > --- begin here
    > >
    > > #include <stdio.h>
    > > #include <stdlib.h>
    > >
    > > long fact(int num);
    > > int main(void)
    > > {
    > > int i; /* counter */
    > > printf("Input the n!:");
    > > scanf("%d", &i);
    > >
    > > fact(i);
    > >
    > > }
    > > /* Recursive fonction */
    > > long fact(int num)
    > > {
    > > if(num<=1){
    > > return 1;
    > > }
    > > else{
    > > printf("%d!\n|\n%d x (%d-1)!\n", num, num, num);
    > > return (num * fact(num-1));
    > > }
    > > }
    > >
    > > --- end here
    > >
    > > --
    > > Denis H. G.

    >
    > I was also thinking the same thing. I did the following. HOWEVER,
    > scanf() still has to checked for 'funky input chars'. I had no idea how
    > to do this. I suppose I could have thought about it, but I was too
    > lazy.


    In case you still have no idea how to do it, please visit
    http://groups.google.com/group/programhq and check out "More I/O
    Stream" thread. I have posted the code for checking 'funky input chars'
    in case of inputting integers.

    > -------------------ans.c--------------------------------------------------
    > #include <stdio.h>
    > #include <stdib.h>
    >
    > int fact(int);
    >
    > int fact(int num) {
    > if(num(<=1){
    > return 1;
    > }
    > else {
    > printf("%d! * %d! \n",num,num-1);
    > }
    >
    > }
    >
    > int main(void) {
    > int i = 0;
    > printf("Input the n! \n");
    > scanf("%d! \n", &i);
    > fact(i);
    > return 0;
    > }
    >
    > -----------------------------------------------------------------------------
    >
    > Chad
    AK, Nov 7, 2005
    #7
  8. action!

    Chad Guest

    AK wrote:
    > Chad wrote:
    > > Denis H. G. wrote:
    > > > (action!) writes:
    > > >
    > > > > this is my C Programming homework,
    > > > >
    > > > > It wants me to input 10! and output the follow result
    > > > >
    > > > > 10!
    > > > > ↓
    > > > > 10 * 9!
    > > > > ↓
    > > > > 9 * 8!
    > > > > ..................
    > > > > 2* 1!
    > > > > ↓
    > > > > 1
    > > > >
    > > > > I take it for decreasing by degress, so using two for() loop to execute..
    > > > > but I spend two days to try and can not figure out what the problem is.
    > > > >
    > > > > Could anybody show me a hint with this ? thank you so much.
    > > > > [snippet]
    > > >
    > > > Basically, you don't need a "for" loop if you employ a recursive function like the "fact()"
    > > > defined in your code. Therefore, what you want is simply as follows:
    > > >
    > > > --- begin here
    > > >
    > > > #include <stdio.h>
    > > > #include <stdlib.h>
    > > >
    > > > long fact(int num);
    > > > int main(void)
    > > > {
    > > > int i; /* counter */
    > > > printf("Input the n!:");
    > > > scanf("%d", &i);
    > > >
    > > > fact(i);
    > > >
    > > > }
    > > > /* Recursive fonction */
    > > > long fact(int num)
    > > > {
    > > > if(num<=1){
    > > > return 1;
    > > > }
    > > > else{
    > > > printf("%d!\n|\n%d x (%d-1)!\n", num, num, num);
    > > > return (num * fact(num-1));
    > > > }
    > > > }
    > > >
    > > > --- end here
    > > >
    > > > --
    > > > Denis H. G.

    > >
    > > I was also thinking the same thing. I did the following. HOWEVER,
    > > scanf() still has to checked for 'funky input chars'. I had no idea how
    > > to do this. I suppose I could have thought about it, but I was too
    > > lazy.

    >
    > In case you still have no idea how to do it, please visit
    > http://groups.google.com/group/programhq and check out "More I/O
    > Stream" thread. I have posted the code for checking 'funky input chars'
    > in case of inputting integers.
    >
    > > -------------------ans.c--------------------------------------------------
    > > #include <stdio.h>
    > > #include <stdib.h>
    > >
    > > int fact(int);
    > >
    > > int fact(int num) {
    > > if(num(<=1){
    > > return 1;
    > > }
    > > else {
    > > printf("%d! * %d! \n",num,num-1);
    > > }
    > >
    > > }
    > >
    > > int main(void) {
    > > int i = 0;
    > > printf("Input the n! \n");
    > > scanf("%d! \n", &i);
    > > fact(i);
    > > return 0;
    > > }
    > >
    > > -----------------------------------------------------------------------------
    > >
    > > Chad



    Hmmm.... I noticed I forget a line on the fact() function. I guess that
    is what I get for typing it in vs copying and pasting actual working
    code. The fact() I meant to use use was

    int fact(int num) {
    if(num(<=1){
    return 1;
    }
    else {
    printf("%d! * %d! \n",num,num-1);
    fact(num-1); /*line I forget in the original code -( */
    }

    }


    With that out of my system, I will just wander over to the link you
    posted and read it. If I become too dense when I read it, I'll post my
    confusion in the proper forum.

    Chad
    Chad, Nov 8, 2005
    #8
  9. action!

    AK Guest

    Hi Chad

    Chad wrote:
    > AK wrote:
    > > Chad wrote:
    > > > Denis H. G. wrote:
    > > > > (action!) writes:
    > > > >
    > > > > > this is my C Programming homework,
    > > > > >
    > > > > > It wants me to input 10! and output the follow result
    > > > > >
    > > > > > 10!
    > > > > > ↓
    > > > > > 10 * 9!
    > > > > > ↓
    > > > > > 9 * 8!
    > > > > > ..................
    > > > > > 2* 1!
    > > > > > ↓
    > > > > > 1
    > > > > >
    > > > > > I take it for decreasing by degress, so using two for() loop to execute..
    > > > > > but I spend two days to try and can not figure out what the problem is.
    > > > > >
    > > > > > Could anybody show me a hint with this ? thank you so much.
    > > > > > [snippet]
    > > > >
    > > > > Basically, you don't need a "for" loop if you employ a recursive function like the "fact()"
    > > > > defined in your code. Therefore, what you want is simply as follows:
    > > > >
    > > > > --- begin here
    > > > >
    > > > > #include <stdio.h>
    > > > > #include <stdlib.h>
    > > > >
    > > > > long fact(int num);
    > > > > int main(void)
    > > > > {
    > > > > int i; /* counter */
    > > > > printf("Input the n!:");
    > > > > scanf("%d", &i);
    > > > >
    > > > > fact(i);
    > > > >
    > > > > }
    > > > > /* Recursive fonction */
    > > > > long fact(int num)
    > > > > {
    > > > > if(num<=1){
    > > > > return 1;
    > > > > }
    > > > > else{
    > > > > printf("%d!\n|\n%d x (%d-1)!\n", num, num, num);
    > > > > return (num * fact(num-1));
    > > > > }
    > > > > }
    > > > >
    > > > > --- end here
    > > > >
    > > > > --
    > > > > Denis H. G.
    > > >
    > > > I was also thinking the same thing. I did the following. HOWEVER,
    > > > scanf() still has to checked for 'funky input chars'. I had no idea how
    > > > to do this. I suppose I could have thought about it, but I was too
    > > > lazy.

    > >
    > > In case you still have no idea how to do it, please visit
    > > http://groups.google.com/group/programhq and check out "More I/O
    > > Stream" thread. I have posted the code for checking 'funky input chars'
    > > in case of inputting integers.
    > >
    > > > -------------------ans.c--------------------------------------------------
    > > > #include <stdio.h>
    > > > #include <stdib.h>
    > > >
    > > > int fact(int);
    > > >
    > > > int fact(int num) {
    > > > if(num(<=1){
    > > > return 1;
    > > > }
    > > > else {
    > > > printf("%d! * %d! \n",num,num-1);
    > > > }
    > > >
    > > > }
    > > >
    > > > int main(void) {
    > > > int i = 0;
    > > > printf("Input the n! \n");
    > > > scanf("%d! \n", &i);
    > > > fact(i);
    > > > return 0;
    > > > }
    > > >
    > > > -----------------------------------------------------------------------------
    > > >
    > > > Chad

    >
    >
    > Hmmm.... I noticed I forget a line on the fact() function. I guess that
    > is what I get for typing it in vs copying and pasting actual working
    > code. The fact() I meant to use use was
    >
    > int fact(int num) {
    > if(num(<=1){
    > return 1;
    > }
    > else {
    > printf("%d! * %d! \n",num,num-1);
    > fact(num-1); /*line I forget in the original code -( */
    > }
    >
    > }
    >
    >
    > With that out of my system, I will just wander over to the link you
    > posted and read it. If I become too dense when I read it, I'll post my
    > confusion in the proper forum.
    >

    proper forum?????????

    Regards
    AK
    AK, Nov 8, 2005
    #9
  10. action!

    Chad Guest


    > > Hmmm.... I noticed I forget a line on the fact() function. I guess that
    > > is what I get for typing it in vs copying and pasting actual working
    > > code. The fact() I meant to use use was
    > >
    > > int fact(int num) {
    > > if(num(<=1){
    > > return 1;
    > > }
    > > else {
    > > printf("%d! * %d! \n",num,num-1);
    > > fact(num-1); /*line I forget in the original code -( */
    > > }
    > >
    > > }
    > >
    > >
    > > With that out of my system, I will just wander over to the link you
    > > posted and read it. If I become too dense when I read it, I'll post my
    > > confusion in the proper forum.
    > >

    > proper forum?????????
    >
    > Regards
    > AK


    Well, I was thinking that I wouldn't post a question about scanf() in
    say alt.fetish.tongue. Okay, I have managed to wander totally off
    topic.

    Chad
    Chad, Nov 9, 2005
    #10
  11. On Mon, 07 Nov 2005 13:58:11 +0000, Ian Malone <>
    wrote:

    > > scanf("%d! \n", &i);


    > => Ans: check the return value is equal to one. Check the return values
    > of functions.
    >
    > Check the return values of functions.
    >

    Right. (Twice.)

    > Note that if scanf stops scanning then the remaining characters on input
    > are still waiting to be read. So if scanf stops there will still be
    > input waiting and you have to worry about that if you want to read
    > anything else in. E.g. your format string will read the number entered,
    > but if the next character is not a '!' it will be left waiting on the


    Right.

    > input buffer. Similarly for ' ' and '\n' after it.


    Wrong. Any whitespace in a *scanf format matches not just that
    specific character but _all_ consecutive whitespace in the input.
    Thus the ' ' can match and "use up" say several newlines and several
    leading spaces, stopping only at the next "printing" character (or EOF
    including end-of-string or error). FAQ 12.17 at the usual places and
    http://www.eskimo.com/~scs/C-faq/top.html .

    > OTOH "%d%*s" will
    > pick up the number and eat the rest of the string until the end of the
    > input buffer.
    >

    %s matches, and %*s discards, only upto whitespace (or end).

    %*[^\n] discards up to newline, which will often probably usually be
    the same as an "input buffer" but not always.

    > Check the return values of functions.


    Still right. :)


    - David.Thompson1 at worldnet.att.net
    Dave Thompson, Nov 14, 2005
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. keto
    Replies:
    0
    Views:
    883
  2. n00m
    Replies:
    12
    Views:
    1,094
  3. ashjas
    Replies:
    5
    Views:
    1,293
    James Kanze
    Feb 5, 2009
  4. vamsi
    Replies:
    21
    Views:
    2,033
    Keith Thompson
    Mar 9, 2009
  5. PerlFAQ Server
    Replies:
    0
    Views:
    99
    PerlFAQ Server
    Jan 4, 2011
Loading...

Share This Page