最长平台的递归实现

来源:互联网 发布:网络上被诈骗了怎么办 编辑:程序博客网 时间:2024/06/03 13:47

去年11月,我以luoshuifish的名写了这篇文章,由于CSDN后来发生了泄密账号的事,所以那个号登不上去了,我只好放在这个新号的博文中,以便保存。当时的内容如下:


本来早就准备在CSDN写一下在北航学习软件工程的心得,但迟迟没有原创的成果,昨天看了一下《C语言名题精选百则》这本书,书中第一个问题是最长平台问题,题意如下:
已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸,例如,在1,2,2,3,3,3,4,5,5,6中,1,2.2,3.3.3,4,5.5,6都是平台。试编写一个程序,接收一个数组,把这个数组最长的平台找出来。冼镜光在答案中给出了一个特别巧妙的解答,大家有时间可以研究一下:
int longest_plateau(int x[], int n)
{
int length=1;
int i;

for(i=1;i<n;i++)
if(x[i]==x[i-length])
length++;
return length;
   }
冼镜光在书后提到在David Greis的书中提到,Machael Griffiths曾经用递归的方法解过这个题目,你能写出一个递归算法吗?这个问题,我从昨天就开始思考,一开始的思路是这样的,我尝试着用分冶法解决这个问题,但是迟迟得不出结论,原因在于这个数组是连续的,如果采用分冶结构的话,会破坏这个结构的连续性,但是怎么用递归实现呢?我觉得用递归解决问题,最重要的是要弄清要解决问题的结构问题,即n结构与n-1结构的联系,即这个联系如何建立呢?让我们想象一下,n-1结构的最长平台,是n结构的最长平台吗?答案是不一定,分两种情况,第一种情况是n结构最末的元素如果是n-1结构最末元素的延续时,则有可能n结构最末元素可能是最长平台,举例来说,一个n-1结构是
1 2  2 3 3所以最长平台是2或者3,不妨设为2(2在3的前面),此时n结构如果是1 2 2 3 3 3,则可以看出n结构最末元素3形成的平台是n结构的最长平台,如果n结构是1 2 2 3 3 4则n结构的最长平台与n-1结构的最长平台相同,依据此思路,我给出了如下的递归代码:
#include<iostream>
using namespace std;
struct data{
int long_length;
int last_length;
};
data longest_plateau(int n,int x[]){
int long_length=0;
int last_length=0;
data m;
if(n==1){
long_length=1;

last_length=1;

}
else{

if(x[n-1]==x[n-2]){

last_length=longest_plateau(n-1,x).last_length+1;

}

else{

last_length=1;

}
if(last_length>longest_plateau(n-1,x).long_length){

long_length=last_length;

}

else{
long_length=longest_plateau(n-1,x).long_length;
}
}
m.last_length=last_length;
m.long_length=long_length;
return m;
}


int main(){
int a[]={1,2,2,2,2,2,5,5,5,5,5,5,5,5,3,3};


printf("%d",longest_plateau(16,a).long_length);


return 0;
}


参考文献 《C语言名题精选百则》冼镜光