您的位置:首页 > 编程语言

递归的理解【爱奇艺2017年校招笔试题 第一道编程题】

2016-09-18 21:27 369 查看




#include<iostream>

#include <vector>

#include <algorithm> 

#include <iterator>

using namespace std;

int getMax(vector <int> vec)//求最大值

{
return *max_element(vec.begin(),vec.end());

}

int getMin(vector <int> vec)//求最小值

{
return *min_element(vec.begin(), vec.end());

}

//判断数组vec的元素顺序是否符合小明的游玩策略,每一次都将元素进行二分,如果能够找到一组的最小值比一组的最大值还大,则说明可以这样分批玩,否则

//当前玩耍的顺序是和小明之前的策略不吻合的。

bool judge(vector<int> vec)

{
int len=vec.size();
if (len<=2)
{
return true;
}
int i;
bool state;
for (i = 1; i < len;i++)
{
vector<int> left(vec.begin(), vec.begin() + i);//分成两个数组
vector<int> right(vec.begin()+i, vec.end());

/*

此处是我最初的代码:

for (i = 1; i < len;i++)

{
vector<int> left(vec.begin(), vec.begin() + i);//分成两个数组
vector<int> right(vec.begin()+i, vec.end());

if (getMax(left) < getMin(right) || getMin(left) > getMax(right))
{
if (judge(left) == false)
return false;
if(judge(right) == false)
return false;

}

}

return false;

其中体现了我在递归上犯的错误,首先,我的本意是如果当前数组顺序违反了小明的策略,那就直接回退,并返回false,否则就是默认的符合小明的策略,但是我之前并没有

默认的state值,而且,就算有了默认的state值,也无法返回,因为整个过程当中,我一直没有返回true的情况,所以,在分支判断的时候,我并没有考虑完整,所以,在left和right都没有违反小明的策略的时候,应该返回true。

*/
if (getMax(left) < getMin(right) || getMin(left) > getMax(right))
{
if (judge(left) == false)
return false;
else if(judge(right) == false)
return false;
else 
return true;
}
}
return false;

}

int main()

{
vector<int> vec(10);
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end();it++)
{
cin >> *it;
}
bool yes_or_no=true;
yes_or_no = judge(vec);
cout << yes_or_no << endl;
return 0;

}

平时编程很少使用递归,这次一用才发现自己的不足,具体的分析都在代码里面了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息