/*
創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、網(wǎng)站設(shè)計與策劃設(shè)計,衡南網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:衡南等地區(qū)。衡南做網(wǎng)站價格咨詢:18980820575
首先判斷是否是整百年,若是,是否能被400整除,能-閏年,否-平年
若不能被400整除,則是否能被4整除,能-閏年,否-平年
設(shè)panduan是判斷是否閏年的函數(shù),在主函數(shù)中調(diào)用他
*/
#include"stdio.h"
void panduan(int n)
{
if(n%100==0)
if(n%400==0)
printf("輸入的年份是閏年\n");
else
printf("輸入的年份是平年\n");
else if(n%4==0)
printf("輸入的年份是閏年\n");
else
printf("輸入的年份是平年\n");
}
void main()
{
int a;
scanf("%d",a);
panduan(a);
}
手打的,問題解決了
、,就采納,別拖著。否則下次再問沒人會給回答
可以的。
C語言規(guī)定,任意函數(shù)均可以嵌套調(diào)用。所以子函數(shù)可以調(diào)用其它子函數(shù),也可以調(diào)用自身。
如
int?func(int?a)
{
if(a?==?0)?return?0;
return?func(a-1)+a;
}
這樣調(diào)用自身的稱為遞歸調(diào)用。
又如:
int?fa(int?a)
{
return?a*a;
}
int?fb(int?a)
{
return?fa(a)+fa(a);
}
這就是不同函數(shù)調(diào)用的例子。
方法很多。
主要是要將不同類型傳遞給fun2處理。
最簡單float類型最大,fun2的參數(shù)類型就定義為float,然后運算結(jié)果返回float類型。在main函數(shù)用a3,b3,c3接收的時候強轉(zhuǎn)型。
另一種方法,把變量都轉(zhuǎn)換成一種類型傳遞。這里用union共用體類型就比較適合。還方便擴展,如果想添加其他類型還可以在union里添加。
我這里代碼就用第二種方法寫。
#include stdio.h
typedef union data{
char c;
int i;
float f;
}DA;
void fun1(void);
DA fun2(DA n1,DA n2,int nType);//nType=1:char類型。nType=2:int類型。nType=3:float類型。
int main()
{
fun1();
return 0;
}
void fun1(void)
{
char a1=1,a2=2;
int b1=100,b2=300;
float c1=5.1,c2=6.8;
DA n1,n2;
n1.c=a1,n2.c=a2;
char a3=fun2(n1,n2,1).c;
n1.i=b1,n2.i=b2;
int b3=fun2(n1,n2,2).i;
n1.f=c1,n2.f=c2;
float c3=fun2(n1,n2,3).f;
printf("a3=%c\nb3=%d\nc3=%.2f\n",a3,b3,c3);
}
DA fun2(DA n1,DA n2,int nType)//nType=1:char類型。nType=2:int類型。nType=3:float類型。
{
DA n3;
switch(nType)
{
? case 1:n3.c=n1.c+n2.c;break;
? case 2:n3.i=n1.i+n2.i;break;
? case 3:n3.f=n1.f+n2.f;break;
}
return n3;
}
函數(shù)可以調(diào)用自身,這叫做函數(shù)的遞歸調(diào)用
一、基本內(nèi)容:
C語言中的函數(shù)可以遞歸調(diào)用,即:可以直接(簡單遞歸)或間接(間接遞歸)地自己調(diào)自己。
要點:
1、C語言函數(shù)可以遞歸調(diào)用。
2、可以通過直接或間接兩種方式調(diào)用。目前只討論直接遞歸調(diào)用。
二、遞歸條件
采用遞歸方法來解決問題,必須符合以下三個條件:
1、可以把要解決的問題轉(zhuǎn)化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規(guī)律地遞增或遞減。
說明:解決問題的方法相同,調(diào)用函數(shù)的參數(shù)每次不同(有規(guī)律的遞增或遞減),如果沒有規(guī)律也就不能適用遞歸調(diào)用。
2、可以應(yīng)用這個轉(zhuǎn)化過程使問題得到解決。
說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
3、必定要有一個明確的結(jié)束遞歸的條件。
說明:一定要能夠在適當(dāng)?shù)牡胤浇Y(jié)束遞歸調(diào)用。不然可能導(dǎo)致系統(tǒng)崩潰。
三、遞歸實例
例:使用遞歸的方法求n!
當(dāng)n1時,求n!的問題可以轉(zhuǎn)化為n*(n-1)!的新問題。
比如n=5:
第一部分:5*4*3*2*1 n*(n-1)!
第二部分:4*3*2*1 (n-1)*(n-2)!
第三部分:3*2*1 (n-2)(n-3)!
第四部分:2*1 (n-3)(n-4)!
第五部分:1 (n-5)! 5-5=0,得到值1,結(jié)束遞歸。
源程序:
fac(int n)
{int t;
if(n==1)||(n==0) return 1;
else
{ t=n*fac(n-1);
return t;
}
}
main( )
{int m,y;
printf(“Enter m:”);
scanf(“%d”,m);
if(m0) printf(“Input data Error!\n”);
else
{y=fac(m);
printf(“\n%d! =%d \n”,m,y);
}
}
四、遞歸說明
1、當(dāng)函數(shù)自己調(diào)用自己時,系統(tǒng)將自動把函數(shù)中當(dāng)前的變量和形參暫時保留起來,在新一輪的調(diào)用過程中,系統(tǒng)為新調(diào)用的函數(shù)所用到的變量和形參開辟另外的存 儲單元(內(nèi)存空間)。每次調(diào)用函數(shù)所使用的變量在不同的內(nèi)存空間。
2、遞歸調(diào)用的層次越多,同名變量的占用的存儲單元也就越多。一定要記住,每次函數(shù)的調(diào)用,系統(tǒng)都會為該函數(shù)的變量開辟新的內(nèi)存空間。
3、當(dāng)本次調(diào)用的函數(shù)運行結(jié)束時,系統(tǒng)將釋放本次調(diào)用時所占用的內(nèi)存空間。程序的流程返回到上一層的調(diào)用點,同時取得當(dāng)初進入該層時,函數(shù)中的變量和形參 所占用的內(nèi)存空間的數(shù)據(jù)。
4、所有遞歸問題都可以用非遞歸的方法來解決,但對于一些比較復(fù)雜的遞歸問題用非遞歸的方法往往使程序變得十分復(fù)雜難以讀懂,而函數(shù)的遞歸調(diào)用在解決這類 問題時能使程序簡潔明了有較好的可讀性;但由于遞歸調(diào)用過程中,系統(tǒng)要為每一層調(diào)用中的變量開辟內(nèi)存空間、要記住每一層調(diào)用后的返回點、要增加許多額外的 開銷,因此函數(shù)的遞歸調(diào)用通常會降低程序的運行效率。
五、程序流程
fac(int n) /*每次調(diào)用使用不同的參數(shù)*/
{ int t; /*每次調(diào)用都會為變量t開辟不同的內(nèi)存空間*/
if(n==1)||(n==0) /*當(dāng)滿足這些條件返回1 */
return 1;
else
{ t=n*fac(n-1); /*每次程序運行到此處就會用n-1作為參數(shù)再調(diào)用一次本函數(shù),此處是調(diào)用點*/
return t; /*只有在上一句調(diào)用的所有過程全部結(jié)束時才運行到此處。*/
}
}