函数

C++函数相关

1. 为什么使用函数?

①.通过使用函数,,可以将程序模块化,将程序设计的简单直观。

②.通过将一些会被重复多次使用的代码写为函数,可以极大的减轻程序员的代码工作量,降低复杂性,避免重复代码。

③.提高了程序的可读性和可维护性。

#include <iostream> 

using namespace std; 

int max(int num1, int num2);

int main () 

int a = 100;

int b = 200;

int ret;

ret = max(a, b);

cout << "Max value is : " << ret << endl; return 0;

}

 函数返回两个数中较大的那个数 int max(int num1, int num2) 

int result;

if (num1 > num2) 

result = num1;

else 

result = num2;

return result;

}

 

2. 为什么要用函数重载

通过运用函数重载,便不用为了对不同的参数类型或参数个数定义多个函数。多个函数用同一个名字,,但参数的类型和个数不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用相应的函数。这样可以避免对名字空间的污染,有利于程序的可读性。

#include <iostream> 

using namespace std;

class printData

{

public:

void print(int i) 

{ cout << "整数为: " << i << endl;

}

 void print(double f) 

cout << "浮点数为: " << f << endl;

}

 void print(char c[])

 {

 cout << "字符串为: " << c << endl;

}

 };

int main(void) 

{

 printData pd;

输出浮点数 pd.print(500.263); 

char c[] = "Hello C++";

pd.print(c);

return 0;

}

 

3. 什么是值传递

值传递是指只将要使用的值传入函数,而不改变值本身.就是指将一个实参传递给一个形参

 

5

6

7

8

9

10

11

12

#include<iostream.h>

void fun(int a)

{

a=10; //修改参数

}

int main()

{

int x=20;

fun(x); //调用fun函数

cout<<x<<endl; //输出变量,变量的值没改变

return 0;

}

 

通过调用,将实参x的值赋给了函数中的形参a,函数又给a赋值,但x的值并未改变。

 

4. 什么是地址传递

按地址传递就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。

 

#include <iostream> using namespace std;

void swap(int& x, int& y);

int main ()

 {

int a = 100;

int b = 200;

cout << "交换前,a 的值:" << a << endl; cout << "交换前,b 的值:" << b << endl;

swap(a, b); cout << "交换后,a 的值:" << a << endl; cout << "交换后,b 的值:" << b << endl; return 0;

}

void swap(int& x, int& y) 

{

int temp;

temp = x;

x = y;

x */ y = temp;

return;

}

 

该函数通过传递实参的地址,进而使其值发生了改变

 

5. 递归函数

(1)什么是递归函数:函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。

(2)递归函数的作用

举例:计算阶乘n!

 #不使用递归的方法: 

 n=4      #4的阶乘 

 result=1 

 i=1 

 while i<=4: 

     result=result*i 

    i+=1 

 

 print(result)

 #使用递归的方法:

def test1(n):#定义函数来计算数字n的阶乘

     if n==1:

         return 1

    return n * test1(n-1)

 

 print(test1(5))

#1在函数的内部调用自己本身

#2递归函数本质是一个方法的循环调用,注意:有可能出现死循环

#3一定要定义递归的边界(什么时候退出循环)

 

 

输出结果为:

24

120

[Finished in 0.4s]

从上面两中方法的对比可以看出,递归函数的作用和循环的方法效果一样,即递归函数本质上是一个方法的循环调用,注意:有可能会出现死循环。因此,使用递归函数时,一定要定义递归的边界(即什么时候退出循环)。

递归函数的另一个案例是斐波纳契数列。

斐波纳契数列:1,1,2,3,5,8,13。。。(该数列中,有n个数字,从第三个数字开始:数值 =前一个数字 + 前面一个数字)

即,n=(n-2)+(n-1)

def get_num(n):

     if n==1 or n==2:

          return 1 

     return get_num(n-1) + get_num(n-2) 

   nums=[]

  for i in range(1,21): 

     nums.append(get_num(i))

print(nums)

输出结果为:

1 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]2 [Finished in 0.4s]

以上两个案例是递归函数的经典案例,需要记住其使用方法。注意:在实际使用中,递归函数由于消耗时间比较长(相比for循环和while循环),所以很少使用。

 

 

posted @ 2019-09-13 17:10  slanxer  阅读(225)  评论(0编辑  收藏  举报