2014-03-25 140 views
0

我不能找到这个练习的解决方案,这里是任务:递归helper方法


(数组中的指定字符的出现)编写 认定的出现的次数递归方法数组中的指定字符。 您需要 定义以下两种方法。第二个是递归辅助方法。

公共静态诠释计数(CHAR []字符,字符CH)

公共静态诠释计数(烧焦[]字符,字符CH,INT高)

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


1)我能解决这个问题只有当我添加另一个参数(INT指数),但我怎么能做到这一点无需增加其他参数或使用循环?

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); 
    } 
} 
} 

回答

1

正如AllenKll已经指出的那样,high值应该大概需要,你打算为你的index的作用。您一直在统计high变量中发生的次数,但是这种计数可以在递归中“隐藏”。

这些用于递归的“助手”方法的目的一般是这样的:它们通常具有(至少)一个额外的参数,以某种方式描述递归已经进行了多久,或者它还有多远才能继续。至于后者的例子:你也可以使用了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); 
} 

当然,一个只能提供辅助方法。与其说

count(chars, ch); 

的,你可以要求用户呼叫

count(chars, ch, 0); 

但这里的问题是,这种方法可能会被误用:当那么用户传递一个错误的值作为最后一个参数,那么方法不起作用。

注意:这整个“辅助方法”的东西只有当帮助方法是私人有意义。当它是public时,用户仍可能调用错误的方法。我看到public修饰符在任务描述中被要求,但是......当你让你的教师知道这个缺陷时,你可能会收到一些奖励点数;-)

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); 
    } 
} 

辅助方法是这样调用者不需要了解索引“高”参数。在另一种语言中,如C可以有默认参数,则不需要。

1

首先,您的帮助(递归)方法应该是private,而不是public。它需要知道如何工作才能正确调用它。这与良好的软件设计背道而驰,它说实施并不重要,只要它的合同得到遵守。

第一种方法是设置递归方法的初始条件(参数)的面向公众的外观。真正的行动是在递归方法。

递归(辅助)方法通常具有必须被确定(和编码)三两件事:

  • 初始状态
  • 终止条件
  • 如何前进到下一个状态

初始状态通常由facade方法处理,就像你的情况一样。

端接状态通常是在该方法中代码的第一行,并导致立即返回(也为你的情况的情况下)

如果终止条件没有被满足时,状态(和/或计算)可以保存在本地以贡献返回值,然后该方法使用将状态推进到下一个位置的参数来调用它自己。自我呼叫的结果被返回,可能与保存状态的数据相结合。

在你的情况下,你将本地状态传递给下一个呼叫。不要这样做。相反,结合

public static int count(char[] chars, char ch, int index) { 
    // Test for terminating condition 
    if (index == chars.length) { 
     return 0; 
    } 
    // return 1 if ch matches (0 otherwise) plus count from the remaining input 
    return (chars[index] == ch ? 1 : 0) + count(chars, ch, index + 1); 
} 

而且随着0指数调用它来启动进程。

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); 
}