2011-10-05 80 views
-3

如果給定字符串,遞歸地計算(不循環)的小寫的「hi」的次數出現在字符串中給定一個字符串,遞歸地(沒有循環)計算

countHi(「xxhixx」) - > 1

countHi( 「xhixhixx」) - > 2

countHi( 「HI」) - > 1

public class Tester { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     int count = countHi("xxhixx"); 


     System.out.println("countHi: " + count); 


    } 

    public static int countHi(String s) { 
     if (s.length() == 0) { 
      return 0; 
     } 

     int spot = s.indexOf("hi"); 

     if(spot > 0) 
     { 
      String nextString = s.substring(spot + 2); 
      return 1 + countHi(nextString); 
     } 
     return 1; 

    } 
} 
+2

而且你的問題是什麼? –

+3

'indexOf'使用循環。 –

+0

問題是什麼?我假設soem輸入會返回一個太大的數字?您不會考慮大於0的字符串,但根本不包含「hi」。你的方法將返回1它shoudl返回0,您可以刪除德支票長度== 0,而是區分(現貨> = 0) - >遞歸調用+ 1和(現貨< 0) ->返回0 –

回答

0
F(x[1...n]) = 
    if the string starts with "hi" then 1 + F(x[3...n]) 
    else F(x[2...n]) 
3

應具有下列工作代碼:

public static int countHi(String s) { 
    return countHi(s, 0); 
} 

public static int countHi(String s, int pos) { 
    if (s.length() - pos < 2) { 
     return 0; 
    } 

    int result = 0; 
    if(s.charAt(pos) == 'h' && s.charAt(pos + 1) == 'i') { 
     result++; 
    } 

    return result + countHi(s, pos + 2); 
} 
+0

。更新的代碼,而無需子,好像他們是一個字符數組 – MasterCassim

+0

字符串不能被索引你可以用'的charAt()',或者轉換成使用'toCharArray()' –

+0

由於字符數組;更新了我的答案。 – MasterCassim

0

您的遞歸函數將需要一個參數,告訴它在字符串開始查找的位置。如果該位置的字符是'h',則檢查後面的字符是否爲'i';如果是,你找到了一個匹配。

對於檢查字符串的其餘部分的遞歸調用,如果不是'i',則傳遞下一個字符的索引,如果是,則傳遞前面的兩個字符。

(我給剛一說明,而不是實際的代碼,因爲這看起來像一個家庭作業的問題。)

0
public static int recCountHi(String str) {   
    if(str.length() < 2) { 
     return 0; 
    } 
    if(str.substring(0, 2).equals("hi")) {    
     return 1 + recCountHi(str.substring(1));    
    } 
    return recCountHi(str.substring(1));   
} 
0
package com.indivunet.utils; 

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 

public class Tester 
{ 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     printCountFor("xxhixx", 1); 
     printCountFor("", 0); 
     printCountFor("xxhixxhihi", 3); 
     printCountFor(null, 0); 
    } 

    @Test 
    public void countHi() 
    { 
     assertAndPrint("xxhixx", 1); 
     assertAndPrint("", 0); 
     assertAndPrint("xxhixxhihi", 3); 
     assertAndPrint(null, 0); 
    } 

    private void assertAndPrint(String string, int expectedCount) 
    { 
     int count = printCountFor(string, expectedCount); 
     assertEquals(expectedCount, count); 
    } 

    private static int printCountFor(String string, int expected) 
    { 
     int count = countHi(string); 
     System.out.println("string: \"" + string + "\" expected: " + expected + " count: " + count); 
     return count; 
    } 

    public static int countHi(String s) 
    { 
     if (s == null) 
     { 
      return 0; 
     } 

     int count = 0; 
     boolean hiSpotted = true; 
     while (hiSpotted) 
     { 
      int startOfNextHi = s.indexOf("hi"); 
      hiSpotted = startOfNextHi >= 0; 
      if (!hiSpotted) 
      { 
       return count; 
      } 
      s = s.substring(startOfNextHi + 2); 
      count++; 
     } 
     return count; 
    } 
} 
相關問題