兩個表達式分別用兩個遞歸函數來實現。
目前成都創新互聯已為近1000家的企業提供了網站建設、域名、網絡空間、網站托管、服務器租用、企業網站設計、鄰水網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
所以,題目中兩個表達式的描述,就是告訴你不同情況下的函數返回值。
之后根據題意,主函數通過函數指針調用,函數指針就是指向函數的指針。把兩個函數分別賦值給指針,再通過指針調用函數。
下面是代碼:
#include stdio.h
int fn1(int n);
int fn2(int n);
int main()
{
int k=3,n=-1,(*p)(int n);
while(n0)
? printf("請輸入n的值(大于等于0):"),scanf("%d",n);
while(k!=1 k!=2)
? printf("請選擇表達式(輸入1或者2):"),scanf("%d",k);
switch(k)
{
? case 1:p=fn1;break;
? case 2:p=fn2;break;
}
printf("通過表示式%d計算得第N項值為:%d\n",k,p(n));
return 0;
}
int fn1(int n)
{
if(n==0) return 1;
if(n==1) return 2;
return 2*fn1(n-1)+fn1(n-2);
}
int fn2(int n)
{
if(n==0) return 0;
if(n==1) return 1;
return fn2(n-1)+2*fn2(n-2);
}
在程序中出現函數名時,要注意區分以下三種情況:
1. main函數中的int?max(int?x,int?y);?是函數的聲明,一般格式為?返回值?函數名(參數類型?參數);
2. max(a,b)為函數的調用,一般格式為?函數名(參數);
3. 后面的max(int?x,int?y){?...}是函數的定義,一般格式為?返回值?函數名(參數類型?參數){函數體}
c語言規定,在一個函數定義之前調用它,需要提前進行聲明。
原因是,如果沒有聲明函數,當程序運行到max(a,b)時,由于后面的函數定義還沒有被讀到,所以計算機并不知道max是個什么東西,程序就會出錯。
如果將函數定義提到main函數的前面,就無需進行聲明了,程序也不會報錯。
#include?stdio.h
double?f(double?x,double?y)
{?if(x=y)
return?(x+y)/2.0;
else
return?f(f(x+2,y-1),f(x+1,y-2))?//這里不知道怎么運算,求解答,是不是把5和7帶入兩個式子中,條件都滿足,為什么結果是6而不是5,謝謝
}
int?main()
{
printf("%.1f",f(5.0,7.0));
}
來,開始了:主程序中,函數參數為 5.0,7.0.看回函數體:
double?f(double?x,double?y)//第一次從程序調用函數時,x=5.0,y=7.0
{?if(x=y)???//xy成立嗎?不成立,跳過下面一步,轉到else部分
return?(x+y)/2.0;
else??//執行這里
return?f(f(x+2,y-1),f(x+1,y-2))?//這里返回什么?返回函數f(f(x+2,y-1),f(x+1,y-2))的結果,將前面x=5.0,y=7.0代入,化簡,即要返回f(f(7.0,6.0),f(6.0,5.0)).這個結果包含兩個函數參數:f(7.0,6.0),f(6.0,5.0).也就是說,這個結果要用這兩個函數的結果去做參數進行調用自身,得出的結果才能返回給主程序.
//先看第一個參數:f(7.0,6.0),將x7.0,y=6.0代入調用函數體,明顯,符合xy,執行if部分的內容返回(x+y)/2.0=6.5
//第二個參數:f(6.0,5.0),同樣,滿足xy,執行if內容,返回(x+y)/2.0=5.5
//即第一次運行函數時,返回f(6.5,5.5).再代入函數體,又有xy成立,執行if部分
//結果是,返回??(x+y)/2.0=(6.5+5.5)/2.0=6.0
}
//重點是遞歸函數.建議好好理解一下遞歸的意義
C/C++語言中,默認情況下,函數時可以從文件外部調用的。因此,函數存儲類型 extern 可以省略,表示是外部函數。static 用來表示函數存儲類型時,表示內部函數,不能從外部文件調用。
新聞標題:c語言中的函數問題 c語言函數經典題目
網頁URL:http://vcdvsql.cn/article26/ddoigcg.html
成都網站建設公司_創新互聯,為您提供響應式網站、、網站排名、手機網站建設、網站導航、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯