实验5 递归
1、 编写递归算法int max(int a[],int left, int right),求数组a[left…right]中的最大数。
#include "ArrayIo.h"
int max(int a[],int left,int right)
{
int lmax,rmax,mid;
if (left==right) return a[left];
else
{
mid=(left+right)/2;
lmax=max(a,left,mid);
rmax=max(a,mid+1,right);
return lmax>rmax?lmax:rmax;
}
}
int main()
{ int a[10];
input(a,10);
print(a,10);
printf("数组的最大数是:%d\n",max(a,0,9));
return 0;
}
2、请编写一个递归算法函数void partion(int a[], int left, int right),将数组a[left…right]中的所有奇数调整到表的左边,所有偶数调整到表的右边。
#include "ArrayIo.h"
#define N 10
void partion(int a[], int left,int right)
{
int x;
if (left<right)
{
while (left<right && a[left]%2==1)
left++;
while (left<right && a[right]%2==0)
right--;
if (left<right)
{
x=a[left];
a[left]=a[right];
a[right]=x;
partion(a,left+1,right-1);
}
}
}
int main()
{ int a[N];
init(a,N);
print(a,N);
partion(a,0,N-1);
print(a,N);
return 0;
}
3、请编写递归函数void bubbleSort(int a[],int n),对长度为n的数组采用冒泡法进行升序排序。请编写递归函数int binSearch(int a[], int left, int right,int key),采用二分查找法在数组a[left…right]中查找值为key的元素所在的位置, 若查找失败函数返回-1。
#include "ArrayIo.h"
#define N 10
void bubbleSort(int a[],int n)
{ int i,t;
int flag;
if(n>0)
{
flag=0;
for(i=0;i<n-1;i++)
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
flag=1;
}
}
if (flag==1) bubbleSort(a,n-1);
}
return ;
}
int binSearch(int a[], int left,int right,int key)
{
int mid;
if (left>right)
return -1;
else
{
mid=(left+right)/2;
if (a[mid]==key)
return mid;
else
if (key<a[mid])
return binSearch(a,left,mid-1,key);
else
return binSearch(a,mid+1,right,key);
}
}
int main()
{ int x,pos,a[N];
init(a,N);
bubbleSort(a,N);
print(a,N);
printf("请输入要查找的数:\n");
scanf("%d",&x);
pos=binSearch(a,0,N-1,x);
if (pos!=-1) printf("a[%d]=%d\n",pos,x);
else printf("Not found!\n");
return 0;
}
4、已知带头结点的单链表结构定义同实验3,假设链表中所有结点值均不相同,请编写一个递归函数linklist max(linklist head),返回表中最大数所在的结点地址,若链表为空,返回NULL。
#include "slnklist.h"
linklist max(linklist head)
{
linklist m;
if (head->next==NULL)
return NULL;
else
if (head->next->next==NULL)
return head->next;
else
{
m=max(head->next);
return head->next->info > m->info ? head->next:m;
}
}
int main()
{ linklist head,p;
head=creatbyqueue();
print(head);
p=max(head);
if (p)
printf("max=%d\n",p->info);
else
printf("链表为空\n");
return 0;
}