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

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

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXZhbl9xaW5feWlfcXVhbg==,size_16,color_FFFFFF,t_70,g_se,x_16

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值