【发布时间】:2018-04-09 09:26:46
【问题描述】:
我正在使用下面的代码,它返回向量中的最小正整数。我得到了代码here。我的问题是有理由将大小传递给函数,你可以不在函数体中计算它吗?
第二个if() 测试是为了什么?我不明白这个 if 语句是如何工作的?
#include <vector>
using namespace std;
int rec_min_pos(const vector<int> & nums, int size) {
if (size < 1) {
return INT_MAX;
}
if(nums[size-1] > 0){
return min(nums[size-1], rec_min_pos(nums, size-1));
}
else{
return rec_min_pos(nums, size-1);
}
}
【问题讨论】:
-
size参数应该命名为index或其他名称。这很令人困惑,因为它与向量的大小没有任何关系。 -
向量知道它们有多大。但请注意,该函数是递归的,它不会每次都对整个向量进行操作。
-
size参数可能可以命名为last_elem,这是必要的,因为该函数以递归方式而不是循环工作。它实际上不是向量的大小,而是函数将搜索最小正元素的向量部分(第一次调用应该是完整大小,递归调用会查找更小的部分)。第二个 if 检查最后一个元素是否为负数,否则返回向量下一部分中找到的最佳值。 -
当您忽略
size参数并改用nums.size()时发生了什么?你从中学到了什么?哦,是的,当您在调试器中单步执行程序时看到了什么? -
顺便说一句,编写这样的递归函数不是很明智。更喜欢涉及
std::min_element和合适谓词的东西。 (例如[](int lhs, int rhs){ return std::tie(!std::signbit(lhs), lhs) < std::tie(!std::signbit(rhs), rhs) }.