我应该如何递归地编写这个Java函数?

时间:2017-03-26 15:41:37

标签: java loops recursion

我试图以递归方式编写Java代码:

public static int count(String word) {
    int numValue = 0;
    int length = word.length();
    for(int i=0; i<length; i++){
        String alpha = "abcdefghijklmnopqrstuvwxyz";
        String letter = (word.substring(0 + i,1 + i));
        numValue = numValue + alpha.indexOf(letter) + 1;
    }
    return numValue;
    }


public static void main(String[] args) {
    System.out.println(count("abc"));
}

该函数返回输入字符串参数中每个字母的索引之和。

我试图以同样的方式编写相同的代码,任何人都可以指出我出错的地方吗?

public static int count(int numValue, int i, String word) {
    String alpha = "abcdefghijklmnopqrstuvwxyz";
    if( i >= word.length()){
        return numValue;
    }
    else{
        String letter = (word.substring(0 + i,1 + i));
        numValue = numValue + alpha.indexOf(letter) + 1;
        count(numValue, i=i+1, word);
    }
    return numValue;
}

  public static void main(String[] args) {
        System.out.println(count(0,0, "abc"));
    }

3 个答案:

答案 0 :(得分:1)

一种更简单的方法就是一次又一次地缩小字符串。

public static int count(String word) {
    if (word.isEmpty()) {
        return 0;
    }
    final String alpha = "abcdefghijklmnopqrstuvwxyz";
    return alpha.indexOf(word.charAt(0)) + count(word.substring(1));
}

答案 1 :(得分:1)

要将此函数更改为递归,您最好使用分而治之的方法,这很容易实现。我将以简单而冗长的方式呈现它,以便您可以清楚地看到这些步骤。

public static int count(String word) {
    int numValue = 0;
    int length = word.length();
    if(length > 1)
    {
        String substring1 = word.substring(0, length/2);
        String substring2 = word.subtring(length/2 + 1, length);
        numValue += count(substring1);
        numValue += count(substring2);
        return numValue;
    }
    else 
    {
        String alpha = "abcdefghijklmnopqrstuvwxyz";
        return alpha.indexOf(word) + 1;
    }
}

public static void main(String[] args) {
    System.out.println(count("abc"));
}

我认为你这样做是为了教导自己递归 - 如果没有,你可能想要想一下,使用迭代方法而不是递归是否更好。

答案 2 :(得分:0)

变量numValue的类型为int。所以它在调用方法中没有改变,你将它传递给另一个方法并在那里进行更改。这意味着,行count(numValue, i=i+1, word);基本上什么都不做。

您可以通过返回递归调用的结果来更正方法(因为您在if中返回,不需要else):

public static int count(int numValue, int i, String word) {
    String alpha = "abcdefghijklmnopqrstuvwxyz";
    if( i >= word.length()){
        return numValue;
    }
    String letter = (word.substring(0 + i,1 + i));
    numValue = numValue + alpha.indexOf(letter) + 1;
    return count(numValue, i=i+1, word);
}

这就是为什么你的功能无法正常工作的原因。蒂姆劳提供的答案是一种更好的递归解决方案。