奈何~~我對遞歸完全沒辦法~各種不理解~~我決定把各種簡單的複雜的遞歸題都放在這~~我就看就想就調試~我不信了,我還能被遞歸嚇死!!!
一.函數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)