Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归辅助方法_Java_Recursion_Helpermethods - Fatal编程技术网

Java 递归辅助方法

Java 递归辅助方法,java,recursion,helpermethods,Java,Recursion,Helpermethods,我无法找到此练习的正确解决方案,任务如下: 数组中指定字符的出现会写入一个递归方法 查找数组中指定字符的出现次数。你需要 定义以下两种方法。第二种方法是递归辅助方法 公共静态int countchar[]字符,字符ch 公共静态int countchar[]字符,字符ch,int高 编写一个测试程序,提示用户在一行中输入字符列表, 和一个字符,并显示该字符在列表中的出现次数 1我只能在添加另一个参数int index的情况下解决它,但如何在不添加另一个参数或使用for loop的情况下解决它 2

我无法找到此练习的正确解决方案,任务如下:

数组中指定字符的出现会写入一个递归方法 查找数组中指定字符的出现次数。你需要 定义以下两种方法。第二种方法是递归辅助方法

公共静态int countchar[]字符,字符ch

公共静态int countchar[]字符,字符ch,int高

编写一个测试程序,提示用户在一行中输入字符列表, 和一个字符,并显示该字符在列表中的出现次数

1我只能在添加另一个参数int index的情况下解决它,但如何在不添加另一个参数或使用for loop的情况下解决它

2为什么有辅助方法?我不理解递归中助手方法的用途

以下是我的解决方案:

package occurencesinarray;

import java.util.Scanner;

public class Start {
public static void main(String[] args){
    System.out.println("Enter few characters: ");
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    char[] chars = new char[s.length()];
    for(int i = 0; i < s.length(); i++){
        chars[i] = s.charAt(i);
    }
    System.out.println("Enter desired character: ");
    char ch = scan.nextLine().charAt(0);

    System.out.println(count(chars, ch));
}

public static int count(char[] chars, char ch){
    return count(chars, ch, 0, 0);
}

public static int count(char[] chars, char ch, int high, int index){
    if(index == chars.length){
        return high;
    }
    if(chars[index] == ch){
        return count(chars, ch, high + 1, index + 1);
    } else{
        return count(chars, ch, high, index + 1);
    }
}
}
这个怎么样:

高代表指数

public static int count(char[] chars, char ch, int high){
    if(high == chars.length){
        return 0;
    }
    if(chars[index] == ch){
        return count(chars, ch, high + 1) + 1;
    } else{
        return count(chars, ch, high + 1);
    }
}
helper方法是这样的,因此调用方不需要知道high参数。在另一种语言中,例如C语言中,您可以使用默认参数,这是不必要的。

这样如何:

高代表指数

public static int count(char[] chars, char ch, int high){
    if(high == chars.length){
        return 0;
    }
    if(chars[index] == ch){
        return count(chars, ch, high + 1) + 1;
    } else{
        return count(chars, ch, high + 1);
    }
}

helper方法是这样的,因此调用方不需要知道high参数。在另一种语言中,例如C语言,您可以使用默认参数,这是不必要的。

首先,您的助手递归方法应该是私有的,而不是公共的。它需要知道如何工作才能正确调用它。这与良好的软件设计背道而驰,即只要遵守合同,实现就不重要

第一种方法就是面向公众的facade,它设置递归方法的初始条件参数。真正的作用在于递归方法

递归助手方法通常有三件事必须确定和编码:

初始状态 终止条件 如何前进到下一个状态 初始状态通常由facade方法处理,就像您的例子一样

终止状态通常是方法中的第一行代码,并导致立即返回,这也是您的案例

如果不满足终止条件,则状态和/或计算可能会在本地保存以贡献返回值,然后该方法使用将状态提前到下一个位置的参数调用自身。返回自调用的结果,可能与保存状态中的数据组合在一起

在您的情况下,您正在将本地状态传递给下一个调用。不要这样做。相反,将其合并:


并使用索引0调用它以启动该过程

首先,助手递归方法应该是私有的,而不是公共的。它需要知道如何工作才能正确调用它。这与良好的软件设计背道而驰,即只要遵守合同,实现就不重要

public static int count(char[] chars, char ch)
{
   return count(chars, ch, 0);
}

public static int count(char[] chars, char ch, int high)
{
    int count = high;
    if chars.size()== 0
    {
       return count;
    }
    else if(chars.indexOf(0) == ch)
    {
       count++;
    }

    return count(Arrays.copyOfRange(charList, 1, charList.size()), ch, count);
}
第一种方法就是面向公众的facade,它设置递归方法的初始条件参数。真正的作用在于递归方法

递归助手方法通常有三件事必须确定和编码:

初始状态 终止条件 如何前进到下一个状态 初始状态通常由facade方法处理,就像您的例子一样

终止状态通常是方法中的第一行代码,并导致立即返回,这也是您的案例

如果不满足终止条件,则状态和/或计算可能会在本地保存以贡献返回值,然后该方法使用将状态提前到下一个位置的参数调用自身。返回自调用的结果,可能与保存状态中的数据组合在一起

在您的情况下,您正在将本地状态传递给下一个调用。不要这样做。相反,将其合并:


并使用索引0调用它以启动该过程

正如Allinkll已经指出的那样,高值可能会扮演你想要的索引角色。您一直在计算high变量中发生的次数,但这种计数可以隐藏在递归中

public static int count(char[] chars, char ch)
{
   return count(chars, ch, 0);
}

public static int count(char[] chars, char ch, int high)
{
    int count = high;
    if chars.size()== 0
    {
       return count;
    }
    else if(chars.indexOf(0) == ch)
    {
       count++;
    }

    return count(Arrays.copyOfRange(charList, 1, charList.size()), ch, count);
}
这些用于递归的辅助方法通常的目的就是:它们通常至少有一个额外的参数,以某种方式描述递归已经进行了多远或还必须进行多远。作为后者的一个例子:您还可以通过编写

public static int count(char[] chars, char ch)
{
    return count(chars, ch, chars.length - 1);
}

public static int count(char[] chars, char ch, int high)
{
    if (high == -1)
    {
        return 0;
    }
    if (chars[high] == ch)
    {
        return 1 + count(chars, ch, high - 1);
    }
    return count(chars, ch, high - 1);
}
当然,只能提供helper方法。而不是打电话

count(chars, ch);
您可以要求用户拨打电话

count(chars, ch, 0);
但这里的问题是,这种方法可能被误用:当用户将错误的值作为最后一个参数传递时,该方法将不起作用

注意:整个helper方法只有在helper方法是私有的情况下才有意义。Wh
如果是公共的,用户仍然可能调用错误的方法。我看到任务描述中请求了公共修饰符,但是。。。当你让你的导师意识到这个缺陷时,也许你会得到一些额外的分数-

正如Allinkll已经指出的那样,高值可能会扮演你想要的索引角色。您一直在计算high变量中发生的次数,但这种计数可以隐藏在递归中

这些用于递归的辅助方法通常的目的就是:它们通常至少有一个额外的参数,以某种方式描述递归已经进行了多远或还必须进行多远。作为后者的一个例子:您还可以通过编写

public static int count(char[] chars, char ch)
{
    return count(chars, ch, chars.length - 1);
}

public static int count(char[] chars, char ch, int high)
{
    if (high == -1)
    {
        return 0;
    }
    if (chars[high] == ch)
    {
        return 1 + count(chars, ch, high - 1);
    }
    return count(chars, ch, high - 1);
}
当然,只能提供helper方法。而不是打电话

count(chars, ch);
您可以要求用户拨打电话

count(chars, ch, 0);
但这里的问题是,这种方法可能被误用:当用户将错误的值作为最后一个参数传递时,该方法将不起作用

注意:整个helper方法只有在helper方法是私有的情况下才有意义。当它是公共的时,用户仍然可能调用错误的方法。我看到任务描述中请求了公共修饰符,但是。。。当你让你的导师意识到这个缺陷时,也许你会得到一些额外的分数-