我试图通过递归将(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;
}
答案 0 :(得分:1)
问题在于您的static
变量在每次调用之间都会持续存在,从而使您无法进行第二次计算。可以包扎此伤口,但最好解决潜在的设计问题,该问题首先使您不得不使用static
变量。无需使用i
(要执行的添加次数)和c
(产品累加器)在功能上人为维护状态。
鉴于乘法是重复a
b
次,您可以建立b == 0
的{{3}}并递归添加a
,递增或递减{ {1}}(取决于b
的符号)直到达到0。乘积累加器b
被函数返回值替换,并且乘数c
用{表示{1}}。
结果更加简洁,每个堆栈帧的状态自然是自相关的:
i
输出:
b
最后,我建议遵循正确的代码样式。压缩代码并使用单字符变量名只会使调试更加困难(此后有人在编辑中取消了原始代码的压缩)。
答案 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); }