c語言子函數調用子函數
⑴ c語言在子函數中調用其他子函數應注意的問題
第一:要保證可以最終退出。
就是說,這樣的調用最終可以回來。
第二:避免循環調用。
就是說當A調用B,然後B又調用A這種情況,一定要有可以跳出的情況,讓某個A或者B在一定條件下不再調用對方就可以返回。
第三:避免調用深度過深。
就是說不能一直調用下去。這個具體能夠調用多少次根據你的硬體/代碼等具體情況確定的。一般來說,1000次是沒有問題的,但是上萬次就基本會出問題了。
⑵ C語言里子函數可以調用子函數嗎
可以的。
C語言規定,任意函數均可以嵌套調用。所以子函數可以調用其它子函數,也可以調用自身。
如
intfunc(inta)
{
if(a==0)return0;
returnfunc(a-1)+a;
}
這樣調用自身的稱為遞歸調用。
又如:
intfa(inta)
{
returna*a;
}
intfb(inta)
{
returnfa(a)+fa(a);
}
這就是不同函數調用的例子。
⑶ c語言中子函數能不能調用子函數
函數可以調用自身,這叫做函數的遞歸調用
一、基本內容:
C語言中的函數可以遞歸調用,即:可以直接(簡單遞歸)或間接(間接遞歸)地自己調自己。
要點:
1、C語言函數可以遞歸調用。
2、可以通過直接或間接兩種方式調用。目前只討論直接遞歸調用。
二、遞歸條件
採用遞歸方法來解決問題,必須符合以下三個條件:
1、可以把要解決的問題轉化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規律地遞增或遞減。
說明:解決問題的方法相同,調用函數的參數每次不同(有規律的遞增或遞減),如果沒有規律也就不能適用遞歸調用。
2、可以應用這個轉化過程使問題得到解決。
說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
3、必定要有一個明確的結束遞歸的條件。
說明:一定要能夠在適當的地方結束遞歸調用。不然可能導致系統崩潰。
三、遞歸實例
例:使用遞歸的方法求n!
當n>1時,求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,結束遞歸。
源程序:
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(m<0) printf(「Input data Error!\n」);
else
{y=fac(m);
printf(「\n%d! =%d \n」,m,y);
}
}
四、遞歸說明
1、當函數自己調用自己時,系統將自動把函數中當前的變數和形參暫時保留起來,在新一輪的調用過程中,系統為新調用的函數所用到的變數和形參開辟另外的存 儲單元(內存空間)。每次調用函數所使用的變數在不同的內存空間。
2、遞歸調用的層次越多,同名變數的佔用的存儲單元也就越多。一定要記住,每次函數的調用,系統都會為該函數的變數開辟新的內存空間。
3、當本次調用的函數運行結束時,系統將釋放本次調用時所佔用的內存空間。程序的流程返回到上一層的調用點,同時取得當初進入該層時,函數中的變數和形參 所佔用的內存空間的數據。
4、所有遞歸問題都可以用非遞歸的方法來解決,但對於一些比較復雜的遞歸問題用非遞歸的方法往往使程序變得十分復雜難以讀懂,而函數的遞歸調用在解決這類 問題時能使程序簡潔明了有較好的可讀性;但由於遞歸調用過程中,系統要為每一層調用中的變數開辟內存空間、要記住每一層調用後的返回點、要增加許多額外的 開銷,因此函數的遞歸調用通常會降低程序的運行效率。
五、程序流程
fac(int n) /*每次調用使用不同的參數*/
{ int t; /*每次調用都會為變數t開辟不同的內存空間*/
if(n==1)||(n==0) /*當滿足這些條件返回1 */
return 1;
else
{ t=n*fac(n-1); /*每次程序運行到此處就會用n-1作為參數再調用一次本函數,此處是調用點*/
return t; /*只有在上一句調用的所有過程全部結束時才運行到此處。*/
}
}
⑷ C語言中能否在一個自定義函數中調用另一個自定義函數
當然可以!
C語言程序的最基本的模塊就是函數,
該程序規定:任意函數都可以調用其它任意一個函數,包括函數本身;
1、函數調用自己本身, 這種稱為遞歸;
通過遞歸,計算1+2+3+...+n值的代碼:
⑸ C語言中 函數使用子函數時一般有哪三個步驟
C語言中想要使用一個自定義函數一般有以下三個步驟:
一、函數聲明:
在開發大型軟體都是採用多人合作開發,一般一個人負責實現幾個功能,這些功能都是通過函數來實現。這總情況下我們一般採用函數聲明和定義分開模式。即函數聲明放在頭文件里。需要用到時包含相應的頭文件及方法庫即可,庫函數就是這種模式。函數的聲明主要是說明函數的名稱以及其所需要的參數類型,參數可以只寫類型不寫變數名,函數定義是需要變數名。
二、函數定義
這一步主要是寫函數功能的實現方法,代碼塊,核心部分。比步可以在函數聲明時進行,即聲明同時定義方法。不過這種方式不適合分享,因為你不一定想分享你的代碼,也許只想分享這個功能。不管哪種方法,在調用函數之前必須進行函數聲明。
三、函數調用
經過以上兩步,我們的函數已經完成。接下來就是使用函數,使用前先搞清楚函數需要有哪些參數,參數一定要傳入合適的類型。第二函數有沒有返回值,返回值的含義。我們可以通過返回值判斷函數的執行情況,一般函數最好有返回值。想清楚後直接調用函數即可。
⑹ c語言中,如何將子函數的一個變數值調用到另一個子函數中
主函數里定義
int
a[100];
子函數定義
void
fun(int
in[]);
調用子函數
fun(a);
⑺ C 語言程序中子函數能不能調用子函數本身
可以。嵌套調用或遞歸調用子函數。
在C語言中,函數嵌套允許在一個函數中調用另外一個函數。例如
funca()
{
funcb();
}
這個就叫做嵌套調用,它是一個語言提供的程序設計的方法,也就是語言的特性。
而遞歸,是一種解決方案,一種思想,將一個大工作分為逐漸減小的小工作,比如說一個人要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然後考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了……以此類推的思考,遞歸是一種思想,只不過在程序中,就是依靠函數嵌套這個特性來實現了。例如
funca()
{
if(statement1)
funca();
else
exit(0);
}遞歸最明顯的特點就是,自己調用自己(就是函數嵌套調用)
⑻ C語言中一個子函數怎麼調用另一個子函數的運算
方法很多。
主要是要將不同類型傳遞給fun2處理。
最簡單float類型最大,fun2的參數類型就定義為float,然後運算結果返回float類型。在main函數用a3,b3,c3接收的時候強轉型。
另一種方法,把變數都轉換成一種類型傳遞。這里用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 b3=%d c3=%.2f ",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;
}
⑼ C語言子函數是否可以互相調用
語法上可以的,但工程上會盡量避免。
另外,遞歸就相當於一種子函數相互調用的極限形式,相當於兩個子函數相同。