当前位置: 首页 > 面试题库 >

Java | 仅使用递归和条件创建显式加法函数

阙项禹
2023-03-14
问题内容

前言

通过在日程安排中找到一些空闲时间,我要求自己提高自己的递归技能(不幸的是)。作为实践,我想通过使用递归来重新创建所有运算符,第一个是加法运算。虽然我有点卡住。

隐含地,我想仅通过使用递归和条件来重新创建加法运算符。尽管我完成了很大一部分代码,但由于只包含一个加法运算符,仍然存在一个问题。这是代码(可以正常运行,并且可以按预期在正,负和零输入的所有变体中添加)。我还提供了一些平庸的评论作为帮助。

public class Test {
    public static void main(String[] args) {
        // Numbers to add
        int firstNumb = -5, secondNumb = 3;
        // Call the add function and save the result
        int result = add(firstNumb, secondNumb);
        // Print result
        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" (second == 0),
     * then return the number that received the value, 'receiver'.
     */
    public static int add(int receiver, int giver) {
        /*
         * Base Case since nothing more to add on. != to handle signed numbers
         * instead of using > or <
         */
        if (giver != 0) {
            /*
             * Recursive Call.
             * 
             * The new 'giver' param is the incremental value of the number
             * towards 0. Ex: -5 -> -4 , 5 -> 4 (so I guess it may decrement).
             * 
             * The new 'receiver' param is the incremental value based on the
             * opposite direction the 'giver' incremented (as to why the
             * directionalIncrement() function needs both values to determine
             * direction.
             */
            return add(directionalIncrement(receiver, giver),
                    directionalIncrement(giver, -giver));
        } else {
            // Return 'receiver' which now contains all values from 'giver'
            return receiver;
        }
    }

    // Increments (or decrements) the 'number' based on the sign of the 'direction'
    public static int directionalIncrement(int number, int direction) {
        // Get incremental value (1 or -1) by dividing 'direction' by absolute
        // value of 'direction'
        int incrementalValue = direction / abs(direction);
        // Increment (or decrement I guess)
        return number + incrementalValue;
    }

    // Calculates absolute value of a number
    public static int abs(int number) {
        // If number is positive, return number, else make it positive by multiplying by -1 then return
        number = (number > 0.0F) ? number : -number;
        return number;
    }
}

问题是包含的行return number + incrementalValue;。如前所述,尽管不符合我自己不涉及任何加法运算符的规范,但代码可与此一起使用。

我将该行更改为,return add(number, incrementalValue);但似乎无法打破递归规则,的确抛出了该网站的标题,StackOverflowException.

所有帮助表示赞赏。提前致谢。

注意

约束不包含任何隐式的增减(i ++ / i–),也不包含按位。尝试并回答我在自己的实现中遇到的特定问题。


问题答案:
public static int add(int a, int b) {
    if(b == 0) return a;
    int sum = a ^ b; //SUM of two integer is A XOR B
    int carry = (a & b) << 1;  //CARRY of two integer is A AND B
    return add(sum, carry);
}

从这里丢人。所有功劳归其作者。



 类似资料:
  • 问题内容: 我需要编写一个称为like的方法。我们需要创建一个迭代方法和一个递归方法(没有任何迭代)。输出需要如下所示: 这段代码可用于迭代,但是我无法使其适应递归。 我应该注意,您不能使用任何类级别的变量或任何外部方法。 问题答案: 请注意,在迭代方法中,您有两个计数器:第一个是您所处的行,第二个是您所处的行的位置。您可以创建一个采用两个参数并将其用作嵌套计数器和的递归函数。在递减x直到其达到0

  • 我还不太理解递归,我有一些作业我不能解决。有人有主意吗? 任务1:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • 这章的中心话题是能够根据程序的状态执行不同命令的if语句。但是首先我想介绍两个新的运算符 : 地板除(floor division)和求余(modulus)。 地板除和求余 地板除 运算符(floor division operator) // 先做除法,然后将结果保留到整数。例如,如果一部电影时长105 分钟,你可能想知道这代表着多少小时。传统的除法操作会返回一个浮点数: >>> minutes

  • 我在这个递归练习中遇到了一个问题。 练习是测试字符数组是否只有大写或小写,然后才返回true;否则,如果同时存在小写和大写字母,则返回false。 下面的代码总是返回true。 我试着在每次有大信号或小信号时都计算一个变量,然后如果数量等于数组,那么它是真的,否则它不是真的;但它没有给我这个。这是一个布尔函数,调用递归并没有给出变量的数量。 守则:

  • 问题内容: 我正在尝试使用Java中的递归创建Palindrome程序,但是我被困住了,这是我到目前为止所拥有的: 谁能提供解决我问题的方法? 问题答案: 在这里,我为您粘贴代码: 但是,我强烈建议您了解其工作原理, 从您的问题出发,您是完全不可读的。 尝试理解此代码。 阅读代码中的注释

  • 需要从单声道递归调用单声道以获得完整的项目。我有一个Pojo项目,在这里我将传递根ID,并尝试从另一个服务获得项目。我写我的服务使用sprignwebFlow。所以我正在使用webClient调用服务并返回Mono 另一项服务将提供该项目及其直接子项。因此,我的要求是,当我传递根id时,我将获得根项及其直接子项,根将LM类型项作为子项。 获得Root项目后,我需要收集所有的LM id,并再次调用每