如何使用递归将两个数字相乘

时间:2018-10-20 17:35:15

标签: c

我试图通过递归将(3,6)和(9,9)相乘,但是打印的结果是18和45。我需要找出哪一部分是错误的;

这是我的代码

#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;
}

3 个答案:

答案 0 :(得分:1)

问题在于您的static变量在每次调用之间都会持续存在,从而使您无法进行第二次计算。可以包扎此伤口,但最好解决潜在的设计问题,该问题首先使您不得不使用static变量。无需使用i(要执行的添加次数)和c(产品累加器)在功能上人为维护状态。

鉴于乘法是重复a b次,您可以建立b == 0的{​​{3}}并递归添加a,递增或递减{ {1}}(取决于b的符号)直到达到0。乘积累加器b被函数返回值替换,并且乘数c用{表示{1}}。

结果更加简洁,每个堆栈帧的状态自然是自相关的:

i

输出:

b

base case

最后,我建议遵循正确的代码样式。压缩代码并使用单字符变量名只会使调试更加困难(此后有人在编辑中取消了原始代码的压缩)。

答案 1 :(得分:0)

#include <stdio.h> int multiply(int a, int b) { if (b != 0) { return a + multiply(a, b > 0 ? b - 1 : 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(0, 7)); printf("%d\n", multiply(7, 0)); printf("%d\n", multiply(0, 0)); printf("%d\n", multiply(-10, -2)); return 0; } 的每次[外部]调用中,18 81 -12 12 0 0 0 -20 c都需要重置为零(正如其他人提到的那样),因为函数范围i是仅初始化一次

由于静态变量位于multiply函数范围内(即main如何访问/重置它们),因此无法执行此操作。它们将需要移至全局/文件范围。

添加一个辅助函数并将变量移至全局范围即可

static

答案 2 :(得分:-1)

尝试在第二次调用之前重设静态变量以进行乘法运算或不执行它们

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); }