1. 对于一个采用字符数组存放的字符串str,设计一个递归算法判断str是否为回文串。回文串是一个正读和反读都一样的字符串,比如level或者noon等就是回文串。
【输入形式】
一个字符串(不包含空格)。
【输出形式】
若该字符串时回文串,则输出Yes,否则输出No
【样例输入1】
level
【样例输出1】
Yes
【样例输入2】
noon
【样例输出2】
Yes
【样例输入3】
good
【样例输出3】
No
//递归思想
void rever(char * p,char*q)
{
if(p>=q)
return ;
char t;
t=*p;*p=*q;*q=t;
rever(++p,--q); //p从前往后,q从后往前
}
int main()
{
//复制作业时,可修改输入形式,字符数组,字符串赋值给另一个字符串的、字符串比较等
char str1[20],str2[20];
cin >> str1;
strcpy(str2,str1);
rever(str2,str2+strlen(str2)-1);
if (strcmp(str2,str1)==0) //字符串翻转后相等即为回文串
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
2.【问题描述】求N!(尾递归)
【输入形式】1个整数N。
【输出形式】1个整数N!的结果。
【样例输入】3
【样例输出】6
【样例说明】3! = 6
传统递归:函数调用时创建一个新的栈帧空间,并将其推入调用栈顶部,用于表示该次函数调用。当一个函数调用发生时,程序状态寄存器保存 调用函数的位置 —— 返回位置,才可以在调用结束时带着返回值回到该位置,返回位置一般存在调用栈上。
int f(int n)
{
...........
return n*f(n-1);
}
5 * f(4)
5 *4 * f(3)
5 *4 *3 * f(2)
5 *4 *3 *2 f(1)
5 *4 *3 *2 *1
每次调用都会创建新的栈空间。
尾递归:在函数定义的最后一条语句执行递归,归返回值不属于表达式的一部分。尾递归函数的特点是在回归过程中不用做任何操作。函数调用的时候是覆盖当前开辟的栈空间,而不是重新开辟新的空间,所以不会导致栈溢出。
尾递归求5!
TailRescuvie(4,5);
TailRescuvie(3,20);
TailRescuvie(2,60);
TailRescuvie(1,120);
每次调用都会覆盖原来的栈空间,相当于迭代。