如何用递归实现替换重写的方法



我想使用递归来折叠代码中重写的add()方法,并允许用户提供任意数量的项。

我对代码做了一些更改,但没有得到想要的结果。

用户输入和预期输出的示例。

输出(用于输入3 + 4(

7.0

输出(用于输入3 + 4 + 5(

12.0

代码我有:

import java.util.*;
public class Recursion {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String exp = input.nextLine();
System.out.println(solver(exp.split(" ")));
}
public static double solver(String[] expression) {
double result = 0;
if (expression.length == 3) {
result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[2]));
}
else if (expression.length == 5) {
result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[2]),
Double.parseDouble(expression[4]));
}
else if (expression.length == 7) {
result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[2]),
Double.parseDouble(expression[4]), Double.parseDouble(expression[6]));
}
else if (expression.length == 9) {
result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[2]),
Double.parseDouble(expression[4]), Double.parseDouble(expression[6]),
Double.parseDouble(expression[8]));
}
else if (expression.length == 11) {
result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[2]),
Double.parseDouble(expression[4]), Double.parseDouble(expression[6]),
Double.parseDouble(expression[8]), Double.parseDouble(expression[10]));
}
return result;
}
public static double add(double a, double b) {return a + b;}
public static double add(double a, double b, double c) {return a + b + c;}
public static double add(double a, double b, double c, double d) {return a + b + c + d;}
public static double add(double a, double b, double c, double d, double e) {return a + b + c + d + e;}
public static double add(double a, double b, double c, double d, double e, double f) {return a + b + c + d + e + f;}
}

这在递归中是可行的。

但是,在深入研究递归实现之前,有必要了解如何迭代地解决这个问题,因为这将使您更好地了解递归的作用。

首先,我想用您提供的代码指出的问题

您现有的解决方案是脆弱的,因为它取决于用户输入的一致性,并且它将因单个额外的空白或空白缺失而失败。

另一个缺点是,您有很多方法,使用它们,您只能处理给定表达式中数量有限的参数。让我们修复它。

由于您的代码旨在执行算术加法,我认为最好在加号+上拆分输入,并使用空格给用户一点自由。

为此,我们需要将以下正则表达式传递到split()方法中:

"\s*\+\s*"
  • \s*-表示0或更多空白
  • \+-plus符号在正则表达式中有特殊含义,需要用反斜杠转义

由于有不止一个算术运算(,您可能还想在上实现其他字母(。最好提取出将用户输入拆分为单独方法的逻辑:

public static double add(String expression) {
return addIteratively(expression.split("\s*\+\s*"));
}

expression.split()将返回一个数字字符串数组,该数组将允许用单个方法替换所有方法,该方法需要字符串数组String[]varargsString... expression(允许您将字符串数组或任意数量的字符串值作为参数传递(。

public static double addIteratively(String[] operands) {
double result = 0;
for (String next: operands) {
result += Double.parseDouble(next);
}
return result;
}

现在,当清楚了如何迭代处理这个任务时,(记住每个问题,并且可以使用迭代来解决也有资格进行递归,反之亦然(,让我们快速回顾一下递推

每种递归方法都由两部分组成:

  • 基本情况-表示一个简单的边缘情况(递归终止时的条件(,其结果事先已知
  • 递归情况-解决方案的一部分,其中进行递归调用,并驻留主逻辑

要递归处理给定的数组,我们可以通过每次方法调用传递来跟踪数组中的位置

基本情况将表示数组中没有更多元素时的情况,即当前位置等于数组的长度。由于在给定的位置下没有元素,因此返回值为0

递归情况中,我们需要解析当前位置下的数字,并将递归调用的结果与位置递增1相加。这将给我们返回值

递归实现可能看起来是:

public static double addAsDouble(String[] operands, int pos) {
if (pos == operands.length) { // base case
return 0;
}
// recursive case
return Double.parseDouble(operands[pos]) + addAsDouble(operands, pos + 1);
}

负责拆分用户输入的方法。

public static double add(String expression) {
return addAsDouble(expression.split("\s*\+\s*"), 0); // recursion starts at position 0
}

main()-在这里,您只需要调用add(),由用户提供一个字符串inter和add内部发生的事情。这使得代码更加清晰易读。

public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String exp = input.nextLine();
System.out.println(add(exp));
}

输出

3 + 4 +5
12.0

您没有将正确的索引传递给各种添加方法。例如,如果您想添加三个数字,您应该执行以下操作:

result = add(Double.parseDouble(expression[0]), Double.parseDouble(expression[1]), Double.parseDouble(expression[2]));

最新更新