【问题标题】:Finding the maximum value in a vector using recursion C++使用递归 C++ 查找向量中的最大值
【发布时间】:2021-11-11 00:48:36
【问题描述】:

我正在尝试使用递归查找向量中的最大值,但我不断遇到分段错误。我无法弄清楚这个问题。有谁知道为什么?

int find_max(vector<int> integer_array, int i) { //variable i just keeps track of the index starting at 0
    
   if(i == integer_array.size()-1) {
       return integer_array[i];
   }
    
    return max(integer_array[i], find_max(integer_array, i++));

}

//Example of a call: find_max(vector_array, 0); 

更新:我知道它效率低下,但这只是为了练习递归......

【问题讨论】:

  • i++ 的值为i。将i++ 更改为i + 1。
  • 使用递归 -- 向量中有多少项?如果有数千个项目,您就有可能使用递归来耗尽堆栈内存。而为什么要用这种非正统的方式(递归)来求最大值呢?使用递归是有正当理由的,比如树遍历,但是要在向量中找到最大项??
  • O(N^2) 存储复杂度 + O(N) 堆栈开销...这几乎就像您正在尝试找到效率最低的方法。

标签: c++ recursion vector


【解决方案1】:

我假设向量总是有元素。

  1. 在return语句中,应该是i+1而不是i++:

return max(integer_array[i], find_max(integer_array, i+1));.

i++ 的问题在于,这种形式会将值i 传递给find_max 作为第二个参数,然后递增。所以你最终会调用return max(integer_array[i], find_max(integer_array, i)) 或return max(integer_array[i+1], find_max(integer_array, i)),我忘记了是否按顺序评估了参数。无论哪种情况,它都不会正确完成。

  1. 另外我建议 find_max 第一个参数使用 const ref:

int find_max(const vector&lt;int&gt; &amp;integer_array, int i)。否则它将一次又一次地复制integer_array,而无需修改内容。见reference。

  1. 感谢 paddy 的评论,对我以后起草答案很有帮助。

【讨论】:

  • 避免指示做什么而不说为什么。您的“建议”实际上涉及 C++ 中一个非常重要的主题。这种算法的编写方式对性能和内存开销都是毁灭性的。您应该描述这一小段语法的不同之处以及它为何如此重要。
  • 感谢您的帮助!是不是因为 i++ 晚点才更新?
  • 是的,没错。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2021-03-23
  • 2013-11-04
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多