遞歸,是函數(shù)實現(xiàn)的一個很重要的環(huán)節(jié),很多程序中都或多或少的使用了遞歸函數(shù)。遞歸的意思就是函數(shù)自己調(diào)用自己本身,或者在自己函數(shù)調(diào)用的下級函數(shù)中調(diào)用自己。
成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元湖北做網(wǎng)站,已為上家服務(wù),為湖北各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
遞歸之所以能實現(xiàn),是因為函數(shù)的每個執(zhí)行過程都在棧中有自己的形參和局部變量的拷貝,這些拷貝和函數(shù)的其他執(zhí)行過程毫不相干。這種機(jī)制是當(dāng)代大多數(shù)程序設(shè)計語言實現(xiàn)子程序結(jié)構(gòu)的基礎(chǔ),是使得遞歸成為可能。假定某個調(diào)用函數(shù)調(diào)用了一個被調(diào)用函數(shù),再假定被調(diào)用函數(shù)又反過來調(diào)用了調(diào)用函數(shù)。這第二個調(diào)用就被稱為調(diào)用函數(shù)的遞歸,因為它發(fā)生在調(diào)用函數(shù)的當(dāng)前執(zhí)行過程運行完畢之前。而且,因為這個原先的調(diào)用函數(shù)、現(xiàn)在的被調(diào)用函數(shù)在棧中較低的位置有它獨立的一組參數(shù)和自變量,原先的參數(shù)和變量將不受影響,所以遞歸能正常工作。程序遍歷執(zhí)行這些函數(shù)的過程就被稱為遞歸下降。
程序員需保證遞歸函數(shù)不會隨意改變靜態(tài)變量和全局變量的值,以避免在遞歸下降過程中的上層函數(shù)出錯。程序員還必須確保有一個終止條件來結(jié)束遞歸下降過程,并且返回到頂層。
double power_negative(double n,int p)
{
double pow = 1;
int q;
q=-p;
if(q0)
pow = power_negative(n,1-q) / n;
return pow;
}
改成這樣,雖然你那個寫的是遞歸調(diào)用,但是返回的卻是1/pow,那么就會是0.5 * 2 * 0.5 * 2 * 0.5這樣的形式返回,所以最終無論是多少,結(jié)果都是0.5,而且遞歸時應(yīng)該用1-q,因為你調(diào)用負(fù)數(shù)求冪,必須使參數(shù)為負(fù)才會正確
/*x^n的值必須小于32767,否則輸出的就是負(fù)數(shù)。因為,int只有這么大,正常的pow函數(shù)應(yīng)該是float型或是double型,參數(shù)也應(yīng)是float或是double型。*/
#include?stdio.h
int?power(int?x,int?n)
{
if?(n1)
{
? ?return?x*power(x,n-1);
}
else
{
? ?if?(n0)
? ? ? ?return?x;
? ?else
? ? ? ? return?1;
}
}
void?main()
{
int?x,n;
printf("input?x,n:");
scanf("%d%d",x,n);
printf("%d",power(x,n));
getch();
clrscr();
}