函數是功能的抽象具體形式,在編程中使用函數不只能夠減小模塊之間的耦合度,程序的主體看的不那麼臃腫,還方便修改功能與代碼重用,大大提高效率。ios
例如:c++
求x的n次方能夠用如下函數:而且在複雜程序中可反覆調用算法
#include <iostream> using namespace std;/*放主函數裏邊只主函數能用*/ double power(double x,int n){ /* x、n爲局部變量*/ double val=1.0; while (n--) val*=x; return val;} int main (){ 執行函數時xn被分配空間,初始化形參 cout <<」5 to the power 2 is 」<<power(5,2)<<endl; /*執行到此處,再按f10則直接出結果 step into/f11再次進入函數 傳值 計算 循環 返回主調函數 調用棧*/ Return 0;} /*函數原型聲明出如今調用點以前便可。*/
C++容許在同一範圍中聲明幾個功能相似的同名函數,可是這些同名函數的形參必須不一樣。用同一個函數完成不一樣的功能就是重載函數。重載函數經常使用來實現功能相似而所處理的數據類型不一樣的問題。編程
注:函數的重載不能只有函數返回值類型不一樣,能不能重載主要看形參而返回值不是主要的方面。數據結構
#include<iostream> using namespace std; int Add(int a, int b) { ` return a + b; } double Add(float a, float b)
{ return a + b; }
int main() { cout<<Add(1,2)<<endl;
cout<<Add(3.5, 4.5)<<endl; return 0; }
形參是實現算法必需要用的數據,而用的時候必需要由實參給出來,被調用時才分配形參的內存單元。函數
值傳遞即將實參的值傳給形參,爲單向。地址傳遞是將實參的訪問權限傳給形參爲雙向的。學習
#include <iostream> using namespace std; void swap (int a,int b){ int t=a; a=b; b=t; } int main(){ int x=5,y=10; count <<」x=」<<x<<」y=」<<y<<endl; swap(x,y); count<<」x=」<<x<<」y=」<<y<<endl; return 0; }
若輸入x=5,y=10咱們指望經過這個函數令x=10,y=5但結果卻沒有變化spa
由於:在swap子函數中交換的一直是ab,主函數中的xy值傳給ab進行交換,xy的值沒有受到影響,這就是值傳遞,也就是形參值的改變沒有影響到實參值。指針
c++中的引用類型語法形式:類型標識符&引用變量名blog
例如int i,j int &ri=i(int型的引用ri,至關於被初始化爲了變量的一個別名) 與指針相似聲明一個引用時,必須對他初始化
上個swap函數形參用引用類型時:
#include <iostream> using namespace std; void swap (int &a,int &b){ int t=a; a=b; b=t; } int main(){ int x=5,y=10; count <<」x=」<<x<<」y=」<<y<<endl; swap(x,y); /*將實參變量與引用名進行關聯,a的地址和x地址便相同了 count<<」x=」<<x<<」y=」<<y<<endl; return 0;
直接或間接地調用函數自己則該函數稱爲遞歸函數 寫遞歸函數要明確邊界條件與遞歸公式。相比於迭代他程序要簡單但佔用的內存空間多。
課上講的漢諾塔問題:
#include <iostream> using namespace std; void move(char src, char dest) { cout << src << "-->" << dest << endl; } void hanoi(int n, char src, char medium, char dest) { if (n == 1) move(src, dest); else { hanoi(n - 1, src, dest, medium); move(src, dest); hanoi(n - 1, medium, src, dest); } } int main() { int m; cout << "Enter the number of diskes :"; cin >> m; cout<<」the steps to moving 「<<m<<」diskes:」<<endl; hanoi(m, 'A', 'B', 'C'); return 0; }
學習數據結構時書上便有漢諾塔問題的解析,由分析可知無論該移到哪一個盤子,它均可以藉助第三根針完成兩針之間位置的轉化,所以漢諾塔問題就能夠經過簡單的遞歸代碼求解。