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




#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;
}

平时编程很少使用递归,这次一用才发现自己的不足,具体的分析都在代码里面了。


































  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值