目錄
函數(shù)是什么
函數(shù)的定義
主函數(shù)舉例
?空函數(shù)
函數(shù)的調(diào)用
語(yǔ)法格式
舉例說明:計(jì)算x的n次方
遞歸
遞歸的主要點(diǎn)
遞歸的結(jié)構(gòu)
條件
遞歸使用的場(chǎng)景
函數(shù)是什么
函數(shù)全名叫計(jì)算機(jī)函數(shù),它可以幫助你完成一些特定的程序。你可以把它簡(jiǎn)單理解成一把手槍。
手槍的作用:完成幾發(fā)子彈進(jìn)行射擊的功能
手槍的結(jié)構(gòu):有固定的幾個(gè)部分構(gòu)成
所以,手槍是具有一定格式,可以完成一些特定功能的一件工具,這就是函數(shù)
函數(shù)的定義
主函數(shù)舉例
int main(){
cout << "Hello world!\n";
return 0;
}
由上得,在創(chuàng)建函數(shù)時(shí),必須編寫其定義。所有函數(shù)定義包括以下組成部分:
- 名稱:每個(gè)函數(shù)都必須有一個(gè)名稱。通常,適用于變量名稱的規(guī)則同樣也適用于函數(shù)名稱。
- 形參列表:調(diào)用函數(shù)的程序模塊可以向其發(fā)送數(shù)據(jù)。形參列表是保存?zhèn)鬟f給函數(shù)的值的變量列表。如果沒有值傳遞給函數(shù),則其形參列表為空。
- 主體:函數(shù)的主體是處理函數(shù)正在執(zhí)行的任務(wù)的一組語(yǔ)句。這些語(yǔ)句包含在一組大括號(hào)中。
- 返回類型:函數(shù)可以將值發(fā)送回調(diào)用它的程序模塊。返回類型是要發(fā)送回的值的數(shù)據(jù)類型。
?語(yǔ)法格式
返回值類型 函數(shù)名稱 (參數(shù)列表)
{
函數(shù)體語(yǔ)句;
return 返回值;
}
?空函數(shù)
如前所述,函數(shù)可以返回一個(gè)值。教程中介紹過的所有程序中的 main 函數(shù)都被聲明為向操作系統(tǒng)返回一個(gè) int 值。"return 0;" 語(yǔ)句使得當(dāng) main 函數(shù)完成執(zhí)行時(shí)返回值 0
然而,并不是所有函數(shù)都一定要返回值。某些函數(shù)只需執(zhí)行一個(gè)或多個(gè)語(yǔ)句,然后返回。在 C++中,這樣的函數(shù)稱為空函數(shù),舉個(gè)例子
void shuchu()
{
cout << "Hello world!\n";
}
?這個(gè)函數(shù)的名稱為shuchu,它的命名方式和變量一樣,函數(shù)應(yīng)該按這種方式命名,即通過名稱揭示其功能。因?yàn)樵摵瘮?shù)不需要接收任何信息以執(zhí)行其任務(wù),所以它的括號(hào)中沒有形參列表
該函數(shù)的返回類型是 void。這意味著函數(shù)在完成執(zhí)行后不返回值,并返回到調(diào)用該程序的部分。因?yàn)闆]有返回值,所以不需要 return 語(yǔ)句。當(dāng)函數(shù)中的語(yǔ)句己經(jīng)完成執(zhí)行并且遇到結(jié)束函數(shù)的封閉大括號(hào)時(shí),程序?qū)?span style="background-color:#ffd900;">自動(dòng)返回
函數(shù)的調(diào)用
功能:使用已定義的函數(shù)
語(yǔ)法格式:
函數(shù)名稱 (參數(shù)列表)
調(diào)用函數(shù)將導(dǎo)致函數(shù)的執(zhí)行。函數(shù) main 在程序啟動(dòng)時(shí)自動(dòng)調(diào)用,但所有其他函數(shù)必須由函數(shù)調(diào)用語(yǔ)句執(zhí)行。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),程序分支到該函數(shù)并執(zhí)行其主體中的語(yǔ)句。?
舉例說明:計(jì)算x的n次方
#include<stdio.h>
#include<math.h>
double power(double x,int n)
{
int m;
m=pow(x,n);
return m;
}
int main()
{
double x,y;
int n;
scanf("%d%lf",&n,&x);
y=power(x,n);
printf("%.2f",y);
return 0;
}
運(yùn)行結(jié)果:
在第3行,我們定義了一個(gè)名字叫power的函數(shù),它的實(shí)際作用是求x的n次方,函數(shù)體內(nèi),使用了math庫(kù)里的一個(gè)函數(shù)——pow函數(shù),它的作用就是求x的n次方。在函數(shù)結(jié)束時(shí),返回一個(gè)m的值
與所有 C++ 程序一樣,該程序是從 main 函數(shù)開始執(zhí)行的,其他函數(shù)只有在它們被調(diào)用時(shí)才執(zhí)行。在上面程序中,函數(shù) power 由 main 函數(shù)中的以下語(yǔ)句調(diào)用:
power(x,n);
遞歸
遞歸就是指一段程序直接或者間接調(diào)用自身的一種方法,通過這種形式執(zhí)行需要進(jìn)行一些固定步驟的許多操作,它可以把一個(gè)復(fù)雜并且龐大的問題簡(jiǎn)單化,通過專注于解決它分化出來的小問題從而解決大問題,從而大大減少我們的代碼量,是提高我們編碼效率的很好方法(遞歸就是容易理解,但是內(nèi)存太高,大型考試建議不要用遞歸(除非不得不用,實(shí)在是做不出來))
遞歸的主要點(diǎn)
- 遞歸函數(shù)的參數(shù)和返回值
- 終止條件
- 遞歸的邏輯設(shè)計(jì)
舉個(gè)例子(求階乘):
int factorial(int n){
if(n==1)
return n;
else
return n*factorial(n-1);
}
int main()
{
int n;
cout<<"請(qǐng)輸入整數(shù):"<<endl;
scanf("%d",&n);
cout<<"整數(shù):"<<n<<"的階乘為:"<<factorial(n)<<endl;
cout<<"\n"<<endl;
return 0;
}
這個(gè)看著不難,不就是個(gè)連乘吧?細(xì)想頭大,就是讓我用計(jì)算器去敲也要半天吧。
但有了遞歸,這個(gè)事情就好說了:
這個(gè)可以看成二個(gè)數(shù)相乘:100×(99×98×97×……×4×3×2×1)
括號(hào)內(nèi)綠色的乘積看作一個(gè)數(shù),簡(jiǎn)單了吧。
如果你還嫌煩,括號(hào)內(nèi)的數(shù)也可以同樣看成二個(gè)數(shù)相乘:
99×(98×97×……×4×3×2×1)
你沒有沒發(fā)現(xiàn)點(diǎn)什么?對(duì)的,我們就把一個(gè)相對(duì)復(fù)雜的式子看作一個(gè)整體,不去考慮它具體的值。
大家繼續(xù)思考下,如果上面的括號(hào)里我還是嫌復(fù)雜呢?是不是還可以繼續(xù)分成二個(gè)數(shù)相乘呢?答案是肯定可以的。
那分解到什么時(shí)候可以直接得到答案呢?
對(duì)的,如果分解成2×1,我們就可以輕松解決了。
那么3×(2×1)也就解決了。同理:
4×(3×2×1)也就解決了。同理呢?
大家應(yīng)該能想到5×(4×3×2×1)也解決了,繼續(xù)擴(kuò)大就可以慢慢解決。
100×(99×98×97×……×4×3×2×1)
遞歸的結(jié)構(gòu)
public void fun(參數(shù)) {
if (終止條件) {
return;
}
fun(參數(shù));
(其他判斷條件或語(yǔ)句);
}
在上邊代碼中,當(dāng)?shù)谝淮芜M(jìn)入函數(shù)時(shí),先判斷是否符合終止條件,符合則直接結(jié)束函數(shù),不符合入下一語(yǔ)句,調(diào)用自己重新進(jìn)入下一層自身函數(shù),(注意這是最外一層將不向下繼續(xù)執(zhí)行語(yǔ)句,外層卡在fun(參數(shù)處)),這個(gè)調(diào)用自己進(jìn)入自身函數(shù)的操作過程即為“遞”的過程。假設(shè)進(jìn)入下一層后符合終止條件,返回結(jié)果,此時(shí)之前進(jìn)入自身函數(shù)執(zhí)行完成返回最外一層函數(shù),最外一層函數(shù)遞歸調(diào)用處得到結(jié)果,(即內(nèi)層函數(shù)執(zhí)行完成得到結(jié)果返回值),這個(gè)過程即為“歸”的過程。這時(shí)最外一層函數(shù)才能繼續(xù)執(zhí)行下一語(yǔ)句,直至函數(shù)運(yùn)行完成。
條件
遞歸必須具備兩個(gè)條件
一是有邊界,即終止條件。
二是需要調(diào)用自己。
遞歸使用的場(chǎng)景
1.大問題可以拆分為多個(gè)子問題。
2.原問題和拆分后的子問題除了數(shù)據(jù)規(guī)模不同,解決思路完全相同。
3.存在遞歸終止條件。
遞歸在線性數(shù)據(jù)結(jié)構(gòu)中使用不太明顯,迭代基本可以很容易地解決問題。
遞歸在非線性結(jié)構(gòu)中非常重要,比如二叉樹,回溯,典型的樹形問題-九宮格字母組合
使用函數(shù)時(shí)常見報(bào)錯(cuò)
1 重定義變量?????????????
Error:redefinition of 'a'
2 ?缺少分號(hào)
Error:expected ';' after expression?
3 數(shù)組維數(shù)錯(cuò)誤
Error:array type 'int [101]' is not assignable
4 ?關(guān)于 if 與 else
Error:expected expression
Warning:?equality comparison result unused [-Wunused-comparison]
if 判斷里不能有分號(hào)!
5 ?關(guān)于 if 與 else
這個(gè)是把等號(hào)寫成了賦值號(hào)
?Warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
這個(gè)特別坑?。?!
6 ?括號(hào)匹配錯(cuò)誤
Error: expected ']'
Error: expected ']'
Error: extraneous closing brace ('}')
7 ?關(guān)于字符串的輸入錯(cuò)誤 (*)
Error:? invalid operands to binary expression ('std::istream' (aka 'basic_istream<char>') and 'char *')
??????? cin>>c+1;
??????? ~~~^ ~~~Warning: operator '>>' has lower precedence than '+'; '+' will be evaluated first [-Wshift-op-parentheses]
??????? cin>>c+1;
?????????? ~~~^~Note: candidate function template not viable: no known conversion from 'std::istream' (aka 'basic_istream<char>') to 'std::byte' for 1st argument
? operator>> (byte? __lhs, _Integer __shift) noexcept
? ^
8 ?寫錯(cuò)函數(shù) / 變量名
Error:?use of undeclared identifier 'mam'; did you mean 'max'?文章來源:http://www.zghlxwxcb.cn/news/detail-811345.html
少年易老學(xué)難成,一寸光陰不可輕。未覺池塘春草夢(mèng),階前梧葉已秋聲?文章來源地址http://www.zghlxwxcb.cn/news/detail-811345.html
到了這里,關(guān)于C++語(yǔ)言基礎(chǔ)——函數(shù)(詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!