我是遞歸盲~~~

奈何~~我對遞歸完全沒辦法~各種不理解~~我決定把各種簡單的複雜的遞歸題都放在這~~我就看就想就調試~我不信了,我還能被遞歸嚇死!!!

一.函數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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章