我是递归盲~~~

奈何~~我对递归完全没办法~各种不理解~~我决定把各种简单的复杂的递归题都放在这~~我就看就想就调试~我不信了,我还能被递归吓死!!!

一.函数pow(x,y)实现运算x^y,即x的y次方,这里x和y都为整数。

算法的基本思想是,减少乘法次数,重复利用结算结果,例如:
x^4,如果逐个相乘的话,需要四次乘法。如果我们这样分解(x^2)*(x^2)就只需要2两次乘法,因为x^2的结果我们可以重复利用。所以我们最好做对称的分解指数y,然后求x^(y/2)的平方。

具体算法如下:
1 如果y为偶数,直接计算mypow(x, y/2)*mypow(x, y/2);
2 如果y为奇数,则y-1为偶数,回到了第一种情况。

#include <iostream>
using namespace std;

int mypow(int x,int n)
{
    if(n == 1)
    {
         return x;
    }
    int result;
    int temp = mypow(x,n/2);
    if(n%2 != 0)
    {
           result = x * temp * temp;       
    }
    else
    {
        result = temp * temp;
    }
    return result;
}

int main()
{
    int x = 3;
    int n = 4;
    cout<<mypow(x,n)<<endl;
    
    system("pause");
}

自己的想法:一层一层调用后,执行到n==1,return x;则temp = x= 3;这个时候n= 2,所以result= temp*temp= 3*3=9;然后return reslut;则temp = result = 9;这个时候

n= 4,result=temp*temp=9*9=81;结束函数。(PS:估计是对的把~我自己想的~)


二.用递归函数完成以下运算:sum(n)=12+22+…+n2

     函数的原型如下:long sum(int n);   该函数完成12+22+…+n2的运算,并返回运算结果,其中n>0。

   

long sum(int n)
{
  if(n==1)
         return 1;
  else
         return n*n+sum(n-1);
}

三.求下列递归函数的结果

int a(int m, int n)
{
    if ( m==0 )
    {
        return n+1;
    } 
    else if ( n==0 )
    {
        return a(m-1,1);
    }
    else
    {
        return a(m-1,a(m,n-1));
    }
}
求a(3,3)。

思路:

f(0,n) =n+1;
f(1,0)=f(0,1)=2;
f(1,1)=f(0,f(1,0))=f(0,2)=3;
f(1,2)=f(0,f(1,1))=f(0,3)=4;
..
f(1,n)=f(0,f(1,n-1)) =n+2;

f(2,0)=f(1,1)=3;
f(2,1)=f(1,f(2,0))=f(1,3)=5;
f(2,2)=f(1,f(2,1))=f(1,f(1,f(2,0)))=7;
f(2,3)=f(1,f(2,2))=f(1,7)=9;
所以f(2,n)= 2*n+3;

同理 f(3,0)=f(2,1)=5;
f(3,1)=f(2,f(3,0))=13;
f(3,2)=f(2,f(3,1))=f(2,13)=29;
f(3,3)=f(2,f(3,2))=61;


四.如果表A中所有元素(a1,a2,…,an)与表B的一个顺序子表(bk,bk+1,…bk+n-1)完全相同(即a1=bk,a2=bk+1,…an=bk+n-1),则称表A包含在表B中。设ha,hb为带头结点的单链表,分别表示有序表A和B,下面的函数用于判别表A是否包含在表B中,若是,则返回true,否则返回false。(提示:用递归实现)

#definetrue 1

#definefalse 0

#defineNULL 0

typedefstruct node{

   int data;

   struct node *next;

}node,linklisttype;

 

intinclusion(linklisttype *ha, linklisttype *hb){

   linklisttype *pa, *pb;

   pa = ha->next;

   pb = hb->next;

        (1)     ;

   while(     (2)     )

      if(pa->data=pb->data)      (3)     ;

      else                   (4)    ;

        (5)     ;

}

参考答案:

(1)if(pa==NULL) return(true)

(2)pb!=NULL && pa->data>=pb->data

(3)return(inclusion(pa, pb))

(4)pb = pb->next;

(5)return(false)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值