2009-11-22 42 views
-11

任何人都可以告诉我如何使用递归编写乘法函数(在C)?使用递归编码整数乘法函数(在C中)

+10

请提供一些证据证明您至少已经尝试过这个问题。这不是一个家庭作业网站。我们在这里帮助,而不是为你做你的工作。 – 2009-11-22 18:10:21

+8

2009年最不合适使用递归的优胜者。 – shoosh 2009-11-22 18:17:16

回答

2

将它重复添加到自身N次。也就是说,如果你想用N乘以一个数..

5

下面是函数:

int mulitplication(x,y) 
{ 
    if (y==0) 
    { 
     return 0; 
    } 
    else 
     return x+multiplication(x,y-1); 
    } 
} 
+0

嘿......你赢了46秒! :) – Randolpho 2009-11-22 18:14:02

+1

StackOverflow,我们来了! XD – 2009-11-22 18:14:22

+1

@Vilx:Maddy *说*递归。它只会为非常大的乘法器(y的值)堆栈溢出 – Randolpho 2009-11-22 18:15:18

3

你必须,如果你想很好的帮助是方式更加具体。但这里有一个在C递归函数相乘两个正整数:

int multiply(int multiplicand, int multiplier) 
{ 
    if(multiplier == 0) 
    { 
    return 0; 
    } 
    return multiply(multiplicand, multiplier - 1) + multiplicand; 
} 

乔纳森·莱弗勒写道:如果乘数为负?

确定:

int multiply(int multiplicand, int multiplier) 
{ 
    if(multiplier == 0) 
    { 
    return 0; 
    } 
    if(multiplier < 0) 
    { 
    return multiply(multiplicand, multiplier + 1) - multiplicand; //Edit: changed "+ multiplicand" to "- multplicand" 
    } 
    return multiply(multiplicand, multiplier - 1) + multiplicand; 
} 

马克拜尔斯说:负版本仍然是错误的。

抱怨,发牢骚。为我的记忆力而写作而无需测试。这个测试了许多整数范围,负值和正值,奇数和偶数。应该适用于任何整数值。 Merry Wintereenmas。

+2

如果乘数是负数? – 2009-11-22 18:17:29

+1

负面版本仍然是错误的。 – 2009-11-22 18:33:07

1

如果我没有错,是这样的...

int mul(int a, int b) 
{ 
if(b==1) 
return a; 
else 
return a+mul(a,b-1); 
} 
+0

hm b <= 0 ;-) – 2009-11-23 08:27:19

9

OK,让我们的是原来的。 :)

unsigned int mul(unsigned int a, unsigned int b) 
{ 
    if (!a || !b) return 0; 
    if (a == 1) return b; 
    if (b == 1) return a; 

    return mul(a-1, b-1)+a+b-1; 
} 
+0

哦,我明白你在那里做了什么。 – Randolpho 2009-11-22 18:21:50

+0

如果两个数字都是负数,会发生笏? -3 * -3 = 9; 但它不工作,如果两者都是负数... – Madhan 2009-11-22 18:47:02

+6

你好? **未签名** int? – 2009-11-22 18:51:53

2

替代版本:

int mulInner(int a, int b, int c) 
{ 
    if (b == 0) 
     return a*c; 
    return mulInner(a, b-1, c+1); 
} 
int mul(int a, int b) 
{ 
    return multInner(a, b, 0); 
} 

嘿,他没有说不要用operator* ...

+0

额外的信贷:不支持负数! – shoosh 2009-11-22 18:22:49

9

如果你真的想打动你的同事和你的老师,提交 - 这是递归和快速!

int mul(int a, int b) 
{ 
    if (a < 0) return -mul(-a,b); 
    if (b < 0) return -mul(a,-b); 
    if (b == 0) return 0; 
    return (mul(a,b>>1)<<1)+(b&1?a:0); 
} 

添加:作为一个额外的好处是,这个正确处理二者阳性,阴性和0值。

+0

优秀的答案,先生你可以解释伪代码背后的逻辑? – Madhan 2009-11-22 19:09:37

+7

不是。 XD每当我给作业回答时,我要么用伪代码给它,给它不完整,要么给它如此扭曲和“聪明”,以致要求它的人没有机会解释它是如何工作的(如果他/她决定把它作为他/她自己)。 :) – 2009-11-22 19:34:07

+0

嗯...看起来不像我伪造的代码。这看起来是一个相当正确的答案。弄清楚它是如何工作的,然后解释给你的老师。 – 2009-11-23 00:04:31

2

这只适用于第一个操作数大于零的情况,但至少它很短并且令人困惑。;)

int mul(int a, int b) { 
    return b + (--a ? mul(a, b) : 0); 
} 

但是,我不知道该评价顺序定义,所以你可能必须移动减量表达外:

int mul(int a, int b) { 
    a--; 
    return b + (a ? mul(a, b) : 0); 
} 
1
int mul(int a,int b) 
{ 
    if(b==1) 
     return a; 
    else 
     return(a+(mul(a,b-1))); 
} 
0

50个字符:

m(x,y){return!y?0:rand()%2?m(x,y+1)-x:m(x,y-1)+x;} 

我确实希望我可以使用rand()函数(特别是以这种方式)和一般syn税收优惠。根据你的系统库和月亮的相位,要注意的是,递归会导致参数值高的段错误,比如计算2 × 3