作为学习递归的实践,我质疑自己使用两个整数的输入(包括正值,负值和零值)显式重新创建加法运算符。然而,问题是我对自己设置了一些严格的约束。
约束
使用递归和条件
无法使用迭代(例如:for
,while
等。)
无法使用隐式迭代(例如:++
,--
)
不能使用数学运算符(例如:+
,-
,/
等。
无法使用速记作业(例如:+=
,-=
,/=
等。
代码
这是我的代码:
/**
* Create explicit addition with given constraints.
*
* @author CodingBash
*
*/
public class Addition {
/**
* Function call
*
* @param args
*/
public static void main(String[] args) {
int firstNumber = 3;
int secondNumber = 6;
// firstNumber + secondNumber
int result = add(firstNumber, secondNumber);
System.out.println(result);
}
/**
* Function recursively takes a number from 'giver' one at a time and
* "gives"/"adds" it to 'receiver'. Once nothing more to "give" ('giver'
* ==0), then return the number that received the values, 'receiver'.
*
* @param receiver
* - parameter that accumulates (++ each layer)
* @param giver
* - parameter that dissipates (-- each layer)
* @return
*/
public static int add(int receiver, int giver) {
if (giver != 0) {
return add(directionalIncrement(receiver, giver),
directionalIncrement(giver, -giver));
} else {
return receiver;
}
}
/**
* Increments (or decrements) the 'number' based on the sign of the
* 'direction'
*
* @param number
* - base number that is incremented or decremented
* @param direction
* - number that determines if base number increments or
* decrements. If positive, increment. If negative, decrement.
* @return
*/
public static int directionalIncrement(int number, int direction) {
int incrementalValue = (direction > 0) ? 1 : -1;
return add(number, incrementalValue); // StackOverflowError
}
}
代码在StackOverflowError
生成return add(number, incrementalValue);
。虽然,如果语句被return number + incrementalValue
替换,则代码与整数输入的任何变体完全一致。但是,这种变化偏离了约束条件。
这项任务是否具有某些不可解决的约束?如果是这样,请解释如何。如果没有,请在给定的约束内提供一个解决方案,最好类似于我的实现。
答案 0 :(得分:1)
使用giver!=0
输入添加功能,然后调用directionalIncrement(giver, -giver)
,为giver
返回一个新值,即1或-1,不是0.然后你调用add
再次giver!=0
。是的,这会导致StackOverFlowError
,因为它一遍又一遍地调用add
而不会返回原始呼叫。代码必须返回到原始调用才能处理堆栈的内容。你的代码只是不断添加到堆栈中。