user3012019
user3012019

Reputation: 75

recursive factorial formula

I want to get an output that displays something like 1*2*3*4 but instead I get 4*3*2*1 this is my code:

public static int fact(int n)

    {
        if(n ==1)
            return 1;
        else
            return n * fact(n-1);
    }

    public static int factorForm(int n)
    {
        System.out.print(n);
        if (n == 1)
            return 1;
        else
        {
            System.out.print("*");
            return n + '*' + factorForm(n-1);
        }
    }

Upvotes: 1

Views: 263

Answers (4)

PoWen
PoWen

Reputation: 61

if you want to get like 1*2*3*4 result. i think you can do this. this is my code:

public static String fact(int n) {
    if (n < 1) {
        throw new RuntimeException("n must be int type and up 0");
    }
    else if (n == 1) {
        return "1";
    } else {
        return n + "*" + fact(n - 1);
    }
}

public static String factorForm(String str) {
    String [] arr = str.split("\\*");
    String [] newArr = new String[arr.length];
    String result = "";
    if (arr.length > 1) {
        for (int i = 0; i < arr.length; i++) {
            newArr[arr.length - i - 1] = arr[i];
        }
        for (int i = 0; i < newArr.length; i++) {
            result += newArr[i] + (i != newArr.length - 1 ? "*" : "");
        }
        return result;
    } else {
        return str;
    }
}

like this. you can get results what you get. may be complicated.

Upvotes: 0

Glenn Teitelbaum
Glenn Teitelbaum

Reputation: 10333

You are calling fact(4)

Then you print

Then you call fact(3)

If you invert that you'll get what you want:

public class fact { 
  static int f(int n)
  {
    if (n ==1 )
    {
        System.out.print(1);
        return 1;
    }
    int ret= (n * f(n-1));
    System.out.print("*");
    System.out.print(n);
    return ret;
  }

  public static void main(String[] args)
  {
    int ret=f(4);
    System.out.print("=");
    System.out.println(ret);
  }
}

Upvotes: 3

tom
tom

Reputation: 22949

To reverse the output, n should be printed after making the recursive call:

public static int factorForm(int n)
{
    if (n == 1)
    {
        System.out.print(1);
        return 1;
    }
    else
    {
        int rest = factorForm(n-1); // prints 1*2*...*n-1
        System.out.print("*");
        System.out.print(n);
        return rest * n;
    }
}

The expression n + '*' + factorForm(n-1) performs integer addition, not multiplication or string concatenation. I changed it to perform multiplication. If the intention is to return the string that was printed, the return type and the type of rest should be changed to String, the return value in the base case should be "1", and that expression should be changed to rest + "*" + n.

Upvotes: 1

Nitin Dandriyal
Nitin Dandriyal

Reputation: 1607

Return after printing as below, more importantly understand how recursion works:

public static int factorForm(int n)
{        
    if (n == 1){
        System.out.print("1*");
        return 1;
    }
    else
    {            
        int val = n * factorForm(n-1);            
        System.out.print(n + "*");
        return val;
    }
}

Upvotes: 0

Related Questions