函数是功能的抽象具体形式,在编程中使用函数不只能够减小模块之间的耦合度,程序的主体看的不那么臃肿,还方便修改功能与代码重用,大大提高效率。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; }
学习数据结构时书上便有汉诺塔问题的解析,由分析可知无论该移到哪一个盘子,它均可以借助第三根针完成两针之间位置的转化,所以汉诺塔问题就能够经过简单的递归代码求解。