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);
每次调用都会覆盖原来的栈空间,相当于迭代。











