-2

我需要创建一个递归函数,它在不使用/.

这是我写的,但只有在除法后它仍然是十进制数而不是浮点数时才有效,这就是我问的原因。

int recursive(int a, int b){
  if ( a == (0.5 * b) )
    return a;
  return recursive(a-1, b);
}

顺便说一句,该函数只能接收 1 个参数而不是 2 个或更多:/

4

4 回答 4

1

使用重复减法和递归将其除以二。

int divide_by_two(int a) {
    if (a < 0) return -divide_by_two(-a);
    if (a < 2) return 0;
    return 1 + divide_by_two(a - 2);
}

概括地说,这a是通过b使用重复减法和递归来划分的。

int divide(int a, int b) {
    if (a < 0) return -divide(-a, b);
    if (b < 0) return -divide(a, -b);
    if (a < b) return 0;
    return 1 + divide(a - b, b);
}

请注意,这些函数的舍入方式与 C 中定义的除法不同。

于 2013-06-08T14:58:52.407 回答
1

我想你需要这样的东西

int divide(int a, int b){
   if(a - b <= 0){
      return 1;
   }
   else {
      return divide(a - b, b) + 1;
   }
}
于 2013-06-08T08:20:24.753 回答
0

你可以试试这个,它应该工作:

int dividebytwo (int a){
    static int answer = 0;

    if (a < 0){
        if ((answer * 2) > a){
            answer --;
            return dividebytwo (a);
        }

        return answer;

    } else if (a > 0){
        if ((answer * 2) < a){
            answer ++;
            return dividebytwo (a);
        }

        return answer;
    }

    return 0;
}

这里的技巧是使用static属性。静态属性意味着该变量只初始化一次,并在每次函数调用后保留其值。确实,您使用了两个参数,但看起来您只使用了一个。

此功能的唯一缺点是您只能指望它多次工作。由于这可能是一个简单的家庭作业,它可能并不重要。但实际上,这被认为是非常低效和不可靠的。

为了补偿这个only-works-once因素,可以添加以下修复之一:

  • 声明answer为全局变量并将其设置为0在每个函数调用之前。

  • 附加return answer = 0;到函数的末尾,而不是return 0;. 这样一来,无论何时您想再次调用它,您都可以预先将其调用为dividebytwo (0);.

我也不能过分强调这是一个多么奇怪的概念,它为任何进行仔细编程的人设置了各种各样的危险信号——这可能就是你得到这么多反对票的原因。所以谨慎使用!

于 2013-06-08T08:38:50.727 回答
0
#include<stdio.h>
int divide(int a, int b){
    if( a-b < 0)
      return 0;
    else if ( a-b == 0)
      return 1;
    else {
      return divide(a-b, b) + 1;
    }
  }

http://codepad.org/o4CoiaON

于 2016-01-18T00:24:21.947 回答