使用约束在Java中显式创建加法运算符。不可解?

时间:2015-12-18 18:03:29

标签: java recursion

作为学习递归的实践,我质疑自己使用两个整数的输入(包括正值,负值和零值)显式重新创建加法运算符。然而,问题是我对自己设置了一些严格的约束。

约束

使用递归和条件

无法使用迭代(例如:forwhile等。)

无法使用隐式迭代(例如:++--

不能使用数学运算符(例如:+-/等。

无法使用速记作业(例如:+=-=/=等。

代码

这是我的代码:

/**
 * 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替换,则代码与整数输入的任何变体完全一致。但是,这种变化偏离了约束条件。

这项任务是否具有某些不可解决的约束?如果是这样,请解释如何。如果没有,请在给定的约束内提供一个解决方案,最好类似于我的实现。

1 个答案:

答案 0 :(得分:1)

使用giver!=0输入添加功能,然后调用directionalIncrement(giver, -giver),为giver返回一个新值,即1或-1,不是0.然后你调用add再次giver!=0。是的,这会导致StackOverFlowError,因为它一遍又一遍地调用add而不会返回原始呼叫。代码必须返回到原始调用才能处理堆栈的内容。你的代码只是不断添加到堆栈中。