1.一个正确的递归算法通常包含( C)。
A.递归出口
B.递归体
C.递归出口和递归体
D.以上都不包含
2.递归函数f(x,y)定义如下:
f(x,y)=f(x-1,y)+f(x,y-1) 当x>0且y>0
f(x,y)=x+y 否则
则f(2,1)的值是( D)。
A.1
B.2
C.3
D.4
3.某递归算法的执行时间的递推关系如下:
T(n)=1 当n=1时
T(n)=T(n/2)+1 当n>1时
则该算法的时间复杂度为( B)。
A.O(1)
B.
C.O(n)
D.
4.某递归算法的执行时间的递推关系如下:
T(n)=1 当n=1时
T(n)=2T(n/2)+1 当n>1时
则该算法的时间复杂度为( C)。
A.O(1)
B.
C.O(n)
D.
5.将递归算法转换成非递归算法时,通常要借助的数据结构是( B)。
A.线性表
B.栈
C.队列
D.树
1 .两个非负整数a和b相加时,若b为0,则结果为a,利用C/C++语言中“++”和“–”运算符其递归定义。
f(a,0)=a;
f(a,b)=f(++a,–b);
#include <iostream>
using namespace std;
int f(int a,int b)
{
if(b==0) return a;
else f(++a,--b);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<f(a,b);
return 0;
}
2 .有如下递归函数:
double pow(double x,int n)
{ if (n==1) return x;
return x*pow(x,n-1);
}
(1)pow(x,n)的功能是什么?
(2)执行pow(2,5)的结果是什么?其执行过程中发生了几次递归调用(含pow(2,5)调用)?
(3)执行pow(x,n)最多发生了几次递归调用(含pow(x,n)调用)?
(1)计算x的n次方。
(2)32。5次。
(3)n次。
3 .设计一个递归算法求一个实型数组a[0…n-1]的平均值。
#include <iostream>
using namespace std;
double f(int a[],int n)
{
if(n==0) return a[0];
else return (a[n]+n*f(a,n-1))/(n+1);
}
int main()
{
int a[10],n,i;
cin>>n;
for(i=0;i<=n;i++)
cin>>a[i];
cout<<f(a,n);
return 0;
}
4 .有一个不带表头节点的单链表,其节点类型为LinkList。设计一个递归算法,删除以h为首指针的单链表中第一个值为x的节点。
void delet(LinkList *pre,LinkList *h,ElemType x)
{
LinkList *s;
if(h==NULL) return;
if(h->data==x)
{
s=h;
h=h->next;
pre->next=h;
free(s);
return;
}
else
{
delet(pre->next,h->next,x);
return;
}
}
5 .有一个不带表头节点的单链表,其节点类型为LinkList。设计一个递归算法,删除以h为首指针的单链表中值为x的所有节点。
void delet(LinkList *pre,LinkList *h,ElemType x)
{
LinkList *s;
if(h==NULL) return;
if(h->data==x)
{
s=h;
h=h->next;
pre->next=h;
free(s);
delet(pre,h,x);
}
else
{
delet(pre->next,h->next,x);
return;
}
}