Click here to Skip to main content
15,868,016 members
Please Sign up or sign in to vote.
2.54/5 (4 votes)
See more:
I am trying to find the max number in the array using recursion, but it keeps returning the index at 0.

I was wondering if this is the right way to go about doing it:
Java
public static double findMax(double[] numbers, int count){
       double max = numbers[0];
       double current= numbers[count-1];

      if(count-1==0){
          return max;
      }
        else{

          if(current>max){
              max= current;
          }

          return  findMax(numbers,count-1);
Posted
Updated 28-Mar-13 9:16am
v4
Comments
Sergey Alexandrovich Kryukov 28-Mar-13 15:05pm    
What, could not see what's going on under the debugger? And why using recursion at all?
—SA
diego14567 28-Mar-13 15:08pm    
the problem states we must use recursion, but i cant seem to get it to give the max output as it always returns the index at 0
Sergey Alexandrovich Kryukov 28-Mar-13 15:18pm    
Who told you that you "must"?

Event with recursion, this is a pretty easy exercise, but with no practical sense and is not efficient. If it is your assignment at programming class, you really need to solve the problem by yourself.
You should remember that in Java variables are passed by value.
—SA
diego14567 28-Mar-13 16:31pm    
my computer science told us we must use recursion or else it will not be counted and we cannot use loops to find the values either

Hint #1:
Since you are calling findMax recursively as the last thing in the function, this is "tail recursion". And tail recursion can be replaced with a loop around the entire function body. If you do this it should become more apparent what is wrong. (I know you said you must use recursion. This is just an exercise in analyzing the behavior of your code.)
Java
public static double findMax(double[] numbers, int count){
  do
  {
    double max = numbers[0];
    double current= numbers[count-1];
 
    if (count-1 == 0) {  // why not if (count == 1) ??
       return max;
    }
    else{
 
      if (current > max){
        max = current;
      }
 
      // return  findMax(numbers,count-1);
      count = count - 1;
    }
  } while (true);
}

Hint #2: What is happening to the variable max each time?
 
Share this answer
 
v2
Comments
Sergey Alexandrovich Kryukov 28-Mar-13 15:33pm    
Some food for thought, right. My 5.
—SA
If you look at your code, you are never returning max, you are returning the result of your recursion unconditionally... and as the item zero is the last one verified, it will return such value.

I am not testing it, so it may miss something, but a correction could be:

C#
public static double findMax(double[] numbers, int count){
      if (count <= 0)
        throw new ArgumentOutOfRangeException("count");

      double current = numbers[count-1];
 
      if(count==1){
          return current;
      }
        else{
 
          double recursiveMax = findMax(numbers,count-1)
          if(recursiveMax>current){
              return recursiveMax;
          }

          return current;
        }
}
 
Share this answer
 
v3
Comments
CPallini 28-Mar-13 16:46pm    
Good, my 5. However Java arrays are 0-based.
Paulo Zemek 28-Mar-13 17:42pm    
It was an error really... it should be double current=numbers[count-1]... but I said I didn't test.
CPallini 29-Mar-13 17:01pm    
Well, you might fix it.
Paulo Zemek 29-Mar-13 17:16pm    
I think it is corrected now... and with a validation at the beginning to make it better.
Java
public static double findMax(double[] numbers, int count)
{
  double c = numbers[count-1];
  if (count==1)
    return c;
  else
  {
    double f = findMax(numbers, count-1);
    return c > f ? c : f;
  }
}
 
Share this answer
 
Comments
Sergey Alexandrovich Kryukov 28-Mar-13 17:05pm    
Well, quite compact. It's nice that it uses only two parameters. My 5.
But too bad OP does not deserve it. I still think it's the best not to provide complete answers to homework questions.
—SA
CPallini 29-Mar-13 17:00pm    
Thank you, Sergey.
i was able to solve it myself heres the code thanks for the help anyways
public static double findMax(double[] numbers, int count){
if(count <= 0){
return Integer.MIN_VALUE;
}

double max = numbers[0];

if(count-1==0){
return max;
}
else{
double current= numbers[count-1];
if(current>max){
max= current;
}

numbers = Arrays.copyOfRange(numbers, 1, count - 1);
double max2 = findMax(numbers,count-2);

if(max2> max){
return max2;

}
else{
return max;
}
}

}
 
Share this answer
 
Please see my comment to the question.

First of all, using recursion for solving such problem is a bad idea.

You algorithm is not working because it's wrong in principle, the whole idea is wrong. You don't have an object storing current maximum value. The variable max is created on stack each time; and it is always the same value: your original array value at index 0. Also, it's apparent that you need the comparison with maximum value. But you have only one comparison; and this comparison does not modify anything: you just modify the value of max which is no longer used; it is removed from stack and simply disappears. It looks like you have no idea how stack variables are allocated and used, that's the problem.

That should be more than enough to explain why your algorithm does not find the maximum. I don't think I should bother about correct algorithm: loop based algorithm is too trivial, and the recursive one makes no sense.

—SA
 
Share this answer
 
Comments
CPallini 28-Mar-13 16:47pm    
It could be homework.
Sergey Alexandrovich Kryukov 28-Mar-13 16:57pm    
According to the last OP's comment, it is; and that's why I don't want to post a solution...
—SA
H.Brydon 29-Mar-13 22:18pm    
OP flagged java as language of interest, but it turns out that with functional languages and/or functional algorithms with non-functional languages, recursion can be used to solve a lot of problems such as this. IMHO we will see a lot more of this in coming years especially with parallel algorithms. I also recently briefly studied a functional dialect of java that require you to do this sort of thing...

[no arguments with your solution.]
Sergey Alexandrovich Kryukov 29-Mar-13 22:40pm    
Thank you for you interesting note.

[My solution was based on the idea that OP just wanted to understand why his code does not find the maximum...]
—SA

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900