changePi Challenge

Hi,

I am working on below challenge
http://codingbat.com/prob/p170924

Psedo code:

1. if array length is zero return ""
2. if array length is 1  return same str
3. else find location of pi and replace with 3.14 if greater than length
4. return replaced string

I wrote my code as below

``````public String changePi(String str) {
if(str.length()==0){
return "";
}
if(str.length()==1){
return str;
}
if(str.length()==2&&"pi".equals(str)){
return "3.14";
}
if(str.length()==1&&!"x".equals(str)){
return str;
}
if(str.length()>1){
return str.replace("pi","3.14");
}

return null;
}``````

I am passing all tests

How to improve/modify my design, code and any other alternate approaches. please advise
phoffric

>> Given a string, compute recursively (no loops) a new string where all appearances of "pi" have been replaced by "3.14".

The instructions say you have to do this challenge recursively.
What would happen if you modified your code to just call replace without all those if statements?
>> No recursion is necessary for this challenge.
You are already stating what the author has observed.
But the challenge is to learn how to use recursion.
phoffric,
I respect the fact that you did not find my answer acceptable. I feel the best way to learn recursion is to step through an example. To try to explain this one without the code would be more difficult for both the explainer and the explainee. This is a fairly basic recursion question and there are many online tutorials as to how recursion works. So I guess my answer turns into: lookup some basic recursion tutorials.

OP,
The question specifically asks for a recursive solution which your code is not.
Sorry for the confusion but I just changed my profile name from IT Manager.
@phoffric,  gudii9 has already gone through 11 recursion challenges last week.  He will not learn anything by using recursion when it is not useful.  He really needs to learn the API better.
@rrz,
>> He will not learn anything by using recursion when it is not useful.  He really needs to learn the API better.

Of course, learning the API is critical to becoming a successful professional. You are welcome to advise the author for this generality.

However, the author is choosing which challenges to participate in. If this question were on a college test, then he would get zero credit for the posted solution. It is up to the author to begin to realize why he got the right answer without using recursion (and that will be useful to him), and then proceed, if he wants, to come up with a recursive solution as required by the challenge.
I'm sorry. I was wrong.   Your choice of the replace method is fine.

``````public String changePi(String str) {

if (str.length() == 0){
return str;

}
else if (str.substring(0,2) == "pi") {
return "3.14" + changePi(str.substring(2));

}
else{
return str.substring(0,2) + changePi(str.substring(2));

}
}

``````
Expected      Run
changePi("xpix") → "x3.14x"      "xpix"      X
changePi("pipi") → "3.143.14"      "pipi"      X
changePi("pip") → "3.14p"      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:7)      X
changePi("pi") → "3.14"      "3.14"      OK
changePi("hip") → "hip"      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:7)      X
changePi("p") → "p"      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:7)      X
changePi("x") → "x"      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:7)      X
changePi("") → ""      ""      OK
changePi("pixx") → "3.14xx"      "pixx"      X
changePi("xyzzy") → "xyzzy"      Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: 2 (line number:7)      X
other tests
X

wrote as above and failing some tests.

``````public String changePi(String str) {

if (str.length()==0||str.length()<2){
return str;

}
else if (str.substring(0,2) == "pi") {
return "3.14" + changePi(str.substring(2));

}
else{
return str.charAt(0) + changePi(str.substring(1));

}
}

``````

above passes more tests but still fails some. please advise
Expected      Run
changePi("xpix") → "x3.14x"      "xpix"      X
changePi("pipi") → "3.143.14"      "pipi"      X
changePi("pip") → "3.14p"      "pip"      X
changePi("pi") → "3.14"      "3.14"      OK
changePi("hip") → "hip"      "hip"      OK
changePi("p") → "p"      "p"      OK
changePi("x") → "x"      "x"      OK
changePi("") → ""      ""      OK
changePi("pixx") → "3.14xx"      "pixx"      X
changePi("xyzzy") → "xyzzy"      "xyzzy"      OK
other tests
X
rrz

membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.

``````public String changePi(String str) {

if (str.length()==0||str.length()<2){
return str;

}
else if (str.substring(0,2).equals("pi")) {
return "3.14" + changePi(str.substring(2));

}
else{
return str.charAt(0) + changePi(str.substring(1));

}
}

A
/* public String changePi(String str) {
if (str.equals("") || str.length() < 2) return str;
if (str.charAt(0) == 'p' && str.charAt(1) == 'i')
return "3.14" + changePi(str.substring(2));
return str.charAt(0) + changePi(str.substring(1));
}*/``````
passed all