【问题标题】:C++ max of an array using recursion issue使用递归问题的数组的 C++ 最大值
【发布时间】:2015-06-05 13:33:05
【问题描述】:

我有这个程序,它使用递归在数组中找到最大的整数,但它会不断返回最后输入的数字,而不是最大数字。我该如何解决这个问题?

#include <iostream>

using namespace std;

int maximum(int digits[], int size, int largest, int i);

void main()
{
  const int size = 3;
  int digits[size];
  int n = 0, x = 0;

  for(int a = 0; a < size; a++)
  {
      cout << "Enter an integer <" << ++x << " out of " << size << ">: ";
      cin >> digits[n];
  }

  cout << "\nThe largest digit is, " << maximum(digits, size, 0, 0) << ", thank you!\n";
  cout << endl;
}


int maximum(int digits[], int size, int largest, int i)
{
  if ( i < size )
  {
      if ( largest < digits[i])
          largest = digits[i];

      maximum( digits, size, largest, i + 1);
  }
  return largest;
}

【问题讨论】:

  • 您是否仔细跟踪了它在运行时在每一行上所做的事情,并将其与您的预期进行比较(例如,使用调试器)?
  • 我有,我觉得这就是我卡住的原因
  • @beginnerjohn,如果每一行执行在你看来都是正确的(所有变量都有预期值,该行是你希望接下来运行的行),那么程序正在像你一样工作期待。

标签: c++ arrays recursion


【解决方案1】:

应该是return maximum( digits, size, largest, i + 1);

Live example.

【讨论】:

  • 最初的问题是程序只返回最后输入的值,不管值是多少,而不是数组中的最大元素。添加 return 并没有改变任何东西。问题已经解决了
  • @beginnerjohn:您关注 Live 示例链接了吗?我只添加了缺少的返回并且它有效。
【解决方案2】:

首先在main()中正确使用索引变量

  for(int a = 0; a < size; a++)
  {
      cout << "Enter an integer <" << ++x << " out of " << size << ">: ";
      cin >> digits[a];//-->Use the index varible correctly.
  }

int maximum(int digits[], int size, int largest, int i)
{
  if(i==size-1)
    return digits[i]; //The base case is specified here.
  if ( i < size )
  {
      int temp= maximum( digits, size, largest, i + 1);
      if ( digits[i] < temp)
          largest =temp;
      else
         largest=digits[i];

  }
  return largest;
}

请查看更改。仔细阅读代码。你会理解你的错误。

在设计递归时,首先要考虑几件事-

  • 基本条件。 (这会停止递归)。

  • 递归步骤。 (您将根据之前的计算进行计算)

  • 组合步骤 - 您必须组合它们(此阶段的值和从递归步骤获得的值)以获得正确答案。在某些情况下不需要此步骤。

【讨论】:

  • 谢谢,这更有意义
  • 一个问题,为什么我要使用 if(i==size - 1) 而不是 if(i==size) 或 if(i>size)?只是为了让我能更好地理解代码。
  • @beginnerjohn.: i==size 没有被使用,因为你不能索引到数组中。为什么不i&gt;size?因为在这种情况下从来不需要这样做。如果我可以用i==size 中断递归,我不必检查i&gt;size,毕竟我们在每一步都将i 增加1 的值。因此,如果没有值 size,则值永远不会是&gt;size
  • 好吧,我想我明白了,我仍然有点不确定,所以我要研究这段代码,再多一点递归对我来说仍然很棘手。谢谢。
  • 实际上没有必要传递最大的。唯一起作用的是空列表。
【解决方案3】:
int biggestOne(int integerArray[], int lengthOfArray, int max)
{
    if (lengthOfArray==0) return max;
    if (max < integerArray[lengthOfArray-1]) max = integerArray[lengthOfArray-1];
    return biggestOne(integerArray,lengthOfArray-1,max); 
}

int main()
{
    int array[] = {7,2,9,10,1};
    int arrSize = sizeof(array)/sizeof(array[0]); //returns length of the array

    cout <<"Biggest number in the array: " << biggestOne(array,arrSize,0) << endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 2013-11-04
    • 2016-05-07
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多