2016-11-02 29 views
1

因此,对于我的任务,我应该编写一个带有2个无符号参数并输出其产品的函数。仅使用递归函数和递增乘以C

unsigned multiply(unsigned a, unsigned b); 

例如,

multiply(3, 4) 

应该返回12

的事情是,我不能使用+, - ,/,*或%的运营商。我只允许调用函数,并用++和 - 递增/递减。

我已增加2个参数的另一个功能:

unsigned add(unsigned a, unsigned b) 
{ 
    if (a > 0) 
     add(--a, ++b); 
    else return(b); 
} 

,我不准叫这个,我有需要的任何辅助功能一起。

我已经花了30分钟尝试各种排列,但我无法获得正确的数学;我来的最接近的是让b翻倍,但这不会削减它。有任何想法吗?

编辑:忘了提及!对于/ while循环不允许任何

回答

2
unsigned add(unsigned a, unsigned b){ 
    if (a > 0) 
     return add(--a, ++b); 
    else 
     return b; 
} 
unsigned multiply(unsigned a, unsigned b){ 
    if(a > 0) 
     return add(b, multiply(--a, b)); 
    else 
     return 0; 
} 
+1

啊哈!我不得不将第二个(a> 0)更改为(a> 1),但是这很好用!谢谢 –

+0

在这种情况下,'multiply(0,5)'的结果会怎样? – BLUEPIXY

0

我没有编译它,但我真的肯定其工作

mutiply(3, 4, 0) 

int mutiply(int a, int b, int result) { 
    if(a > 0) { 
    for(int i=1;i<=b;i++) 
     result++ 
    mutiply(--a, b, result); 
    } else return (result == 0 && a == 0) ? 0 : result; 
} 
+0

'mutiply(3,4)'是'诠释mutiply(INT A,INT B,INT结果)' – BLUEPIXY

+0

抱歉忘了编辑不同的签名呵呵 – HuntsMan

1
int multiply (int a, int b) 
{ 
    int result = 0; 
    for (int i = 0; i < a; i++) { //You repeat "a" times... 
     for (int j = 0; j < b; j++) { //...adding "b" to result. 
      result++; 
     } 
    } 
    return result; 
} 

当然,如果递归性是强制性的,这不会工作。

+0

是的,我忘了提及,它必须是递归的,并且不允许循环 –

0

这是一个使用带累加器的辅助函数的尾递归解决方案。这是基本相同的溶液中使用嵌套for循环:

unsigned multiply(unsigned a, unsigned b) 
{ 
    return mult_helper(a, b, 0, a); 
} 

unsigned mult_helper(unsigned a, unsigned b, unsigned acc, unsigned reset) 
{ 
    if (b == 0) 
     return acc; 
    if (a > 0) 
     return mult_helper(--a, b, ++acc, reset); 
    return mult_helper(reset, --b, acc, reset); 
}