Andy  Tsao
Andy Tsao

Reputation: 13

How to multiply 2 numbers using recursion

I'm trying to multiply (3, 6) and (9, 9) using recursion. However, the result printed is 18 and 45. I need to find out which part is wrong.

Here's my code:

#include <stdio.h>

int multiply (int, int);

int main()
{
    int a, b, c;
    a = 6; b = 3; c = multiply(a, b);
    printf("%d\n", c);
    a = 9; b = 9; c = multiply(a, b);
    printf("%d\n", c);
    return 0;
}

int multiply(int a, int b)
{
    static int c = 0, i = 0;
    if (i < a) {
        c = c + b;
        i++;
        multiply(a, b);
    }

    return c;
}

Upvotes: 0

Views: 7173

Answers (3)

ggorlen
ggorlen

Reputation: 56885

The issue is that multiply's static variables persist from call to call, which throws the second calculation off. It is possible to bandage this wound, but it's better to address the underlying design problem that is compelling use of static variables in the first place. There is no need to artificially maintain state in the function using i (the number of additions to perform) and c (a product accumulator).

Given that multiplication is repeated addition of a b times, you can establish a base case of b == 0 and recursively add a, incrementing or decrementing b (depending on b's sign) until it reaches 0. The product accumulator c is replaced by the function return value and the number of multiplications i is represented by b.

Using this approach, each stack frame's state is naturally self-reliant.

#include <stdio.h>

int multiply(int a, int b) {
    if (b > 0) {
        return a + multiply(a, b - 1);
    }
    else if (b < 0) {
        return -a + multiply(a, b + 1);
    }

    return 0;
}

int main() {
    printf("%d\n", multiply(3, 6));
    printf("%d\n", multiply(9, 9));
    printf("%d\n", multiply(-6, 2));
    printf("%d\n", multiply(6, -2));
    printf("%d\n", multiply(-7, -3));
    printf("%d\n", multiply(0, 7));
    printf("%d\n", multiply(7, 0));
    printf("%d\n", multiply(0, 0));
    return 0;
}

Output:

18
81
-12
-12
21
0
0
0

As a final note, I recommend following proper code style. Minifying your code and using single-character variable names only makes debugging more difficult (someone has since de-minified the original code in an edit).

Upvotes: 2

Matthias
Matthias

Reputation: 3556

Try resetting your static variables before second call to multiply or do without them

int multiply(int a, int b) {
      If (a==0)
           return 1;
      else if (a>0)
           return b+multiply(a-1, b);
        else
          return - 1*multiply(-1*a, b); }

Upvotes: -1

Craig Estey
Craig Estey

Reputation: 33601

Both c and i need to be reset to zero on each [outer] call to multiply [as others have mentioned] because a function scope static variable is only initialized once.

There is no way to do this because the static variables are at multiply function scope (i.e. how does main access/reset them?). They would need to be moved to global/file scope.

Adding a helper function and moving the variables to global scope will do it:

#include <stdio.h>

int multiply(int, int);

int
main()
{
    int a,
     b,
     c;

    a = 6;
    b = 3;
    c = multiply(a, b);
    printf("%d\n", c);

    a = 9;
    b = 9;
    c = multiply(a, b);
    printf("%d\n", c);

    return 0;
}

static int c, i;

int
mul(int a, int b)
{

    if (i < a) {
        c = c + b;
        i++;
        mul(a, b);
    }

    return c;
}

int
multiply(int a, int b)
{

    i = 0;
    c = 0;

    return mul(a,b);
}

Upvotes: 0

Related Questions