akki
akki

Reputation: 19

Getting output from recursion manually in C

So, I have two questions.

Question 1) I find recursion difficult in C. And I have this one question, that I dont know how should I go about attempting it. I want to know its output, Please help me.

#include <stdio.h>
void fun (int);
int main (void)
{
   int a;
   a = 3;
   fun(a);
   printf("\n");
   return 0;
}

void fun ( int n )
{
  if ( n > 0 )
  {
     fun(--n);
     printf("%d",n);
     fun(--n);
  }
}

How can I solve this recursion manually? I know during recursion, the information is stored on stack. Therefore, I tried doing it by that way. Firstly, a will be decremented all the way upto 0. But then, it will exit out of the loop. So, when will it print the values?

Question 2) Also, I Wanted to know since the topic I am studying right now is functions. If I make a function and lets suppose it returns some value, then IS IT MANDATORY that I collect its value upon calling or I can call it without collecting its return value?

For eg: Let's say I made the function as,

int foo ( int a )
{ 
   ........
   return b;
}

Now, if I call this function from inside main, then is it mandatory that I store the returned value in some variable?

Upvotes: 0

Views: 1390

Answers (3)

thewebjackal
thewebjackal

Reputation: 859

I would like to answer your second question About storing the value returned by the called function. The answer returned by the called function can be displayed in two ways.. No.1-You need not store it in any variable in the calling function and print it directly as follows:

#include<stdio.h>
#include<conio.h>
void main()
{
    int a=10, b=9, add(int,int);
    printf("Sum of %d and %d is : %d",a,b,add(a,b));
    getch();

}
int add(int m,int n)
{
    return(m+n);
}

Here,the function call has been written in the printf() function and hence the need of an extra variable has been eliminated No.2-The other way and the code for the same-

#include<stdio.h>
#include<conio.h>
void main()
{
    clrscr();
    int a=10,b=9,c,add(int,int);
    c=add(a,b);
    printf("Sum of %d and %d is : %d",a,b,c);
    getch();

}
int add(int m,int n)
{
    return(m+n);
}

So,you do need a variable for the second method.Because there has to be something to catch the value thrown by the called function

Upvotes: 0

You had 2 questions: the first one is what happens in your code:

To your question #1: Function fun(n) could be rewritten so that it is functionally equivalent but easier to understand, as:

void fun(n) {
   if (n > 0) { 
      fun(n - 1);
      printf("%d", n - 1);
      fun(n - 2);
   }
}

That is:

for fun(n)
    if n > 0,
        first call fun(n - 1)
        then print the number n - 1
        lastly call fun(n - 2)

Thus the following happens when unwinding the recursion:

fun(3) ->
    fun(2) ->
        fun(1) ->
              fun(0) ->
                  n <= 0 -> exits
              prints 0
              fun(-1) ->
                  n <= 0 - exits
        prints 1
        fun(0) ->
            n <= 0 - exits
    prints 2
    fun(1) ->
        fun(0) ->
            exits as n <= 0
        prints 0
        fun(-1) ->
            exits as n <= 0

Execution goes from up to down sequentially - thus the output 0120 from the prints lines.

Question #2:

No, return value does not need to be stored in a variable. In fact, the printf you used returns an int, that tells the number of characters written, but you did not store that return value anywhere.

Upvotes: 6

Ed Heal
Ed Heal

Reputation: 59997

For no 1 - Get a note pad and a pencil.

Start off an write fun(3) - It is in Main.

You can now cross that out an instead write

  if ( 3 > 0 )
  {
     fun(2);
     printf("%d",2);
     fun(1);
  }

(applying the logic of --n)

Repeat with both of those fun. You can do the leg work on this one

Number 2 - You do not have to collect the return value from a function

Upvotes: 2

Related Questions