Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中仅使用递归函数和增量进行乘法_C_Recursion - Fatal编程技术网

C语言中仅使用递归函数和增量进行乘法

C语言中仅使用递归函数和增量进行乘法,c,recursion,C,Recursion,所以,对于我的赋值,我应该编写一个函数,它接受两个无符号参数并输出它们的乘积 unsigned multiply( unsigned a, unsigned b ); 比如说, multiply(3, 4) 应该返回12 问题是,我不允许使用+、-、/、*、或%运算符。我只允许调用函数,并使用++和--递增/递减 我已经创建了另一个函数来添加2个参数: unsigned add(unsigned a, unsigned b) { if (a > 0) add(-

所以,对于我的赋值,我应该编写一个函数,它接受两个无符号参数并输出它们的乘积

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自身翻倍a倍,但这并不能减少它。有什么想法吗


编辑:忘了提了!For/while循环也不允许

我没有编译它,但我确信它能工作

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;
}
multiply(3,4,0)
整数倍(整数a、整数b、整数结果){
如果(a>0){
对于(inti=1;i
intmultiply)(inta,intb)
{
int结果=0;
对于(inti=0;i

当然,如果递归性是强制性的,这将不起作用。

这里有一个尾部递归解决方案,它使用带有累加器的辅助函数。这基本上与使用嵌套
进行
循环的解决方案相同:

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

multiply(3,4)
int multiply(int a,int b,int result)
是不同的签名。
是的,我忘了提到,它必须是递归的,因为循环是不允许的!我不得不将第二个(a>0)改为(a>1),但这很好!谢谢你,在这种情况下,
乘法(0,5)
的结果会怎么样?
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);
}