算法设计与分析作业二递归

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);

每次调用都会覆盖原来的栈空间,相当于迭代。

算法设计与分析作业二递归_第1张图片

你可能感兴趣的:(算法设计与分析,算法)