我需要创建一个递归函数,它在不使用/
.
这是我写的,但只有在除法后它仍然是十进制数而不是浮点数时才有效,这就是我问的原因。
int recursive(int a, int b){
if ( a == (0.5 * b) )
return a;
return recursive(a-1, b);
}
顺便说一句,该函数只能接收 1 个参数而不是 2 个或更多:/
使用重复减法和递归将其除以二。
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 中定义的除法不同。
我想你需要这样的东西
int divide(int a, int b){
if(a - b <= 0){
return 1;
}
else {
return divide(a - b, b) + 1;
}
}
你可以试试这个,它应该工作:
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);
.
我也不能过分强调这是一个多么奇怪的概念,它为任何进行仔细编程的人设置了各种各样的危险信号——这可能就是你得到这么多反对票的原因。所以谨慎使用!
#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;
}
}