函数

函数概述

函数可以看作是“黑盒子”,对应的输入会产生特定的结果或是返回某个数值,而其内部行为不需要考虑

函数调用各部分:

  1. 函数原型:告知编译器函数类型,可以放在main函数之前,也可以放在main函数内部
  2. 函数调用:导致函数的执行
  3. 函数定义:指定函数的具体功能

形参与实参:

  1. 形式参量是局部变量,是被调函数中的变量。在函数的原型中可省略形参名
  2. 实参是调用函数分配给被调函数的特定数值,无论何种形式的实参,执行时首先要求出其值,然后将该值复制给被调函数中相应的形参

ANSI C函数原型

为什么需要在函数原型中指明参数个数和类型?

不指明时的参数传递过程:

  1. 调用函数根据实参类型,将相应的实参放入堆栈
  2. 被调函数根据形参类型,从堆栈中读取数据
  3. 编译器不会检查参数类型!!

如果不确定参数的个数,如printf()

int printf(char *, ...);

递归

递归的基本原理

  1. 每一级函数调用都有自己的变量
  2. 每一次函数调用都会有一次返回,即返回到上一级的调用语句后,继续执行
  3. 位于递归调用的语句和各级被调函数的顺序相同
  4. 位于递归调用的语句和各级被调函数的顺序相反

尾递归

定义:把递归调用语句放在函数结尾,即return语句之前。是最简单的递归形式

递归和反向计算

例:编写一个函数将一个整数转换成二进制形式

解决:在递归调用前求出n%2的值,在递归语句之后进行输出。临界条件是,n<2时,n%2即为n,故直接输出

void to_binary(int n){
	int r;
	r=n%2;
	if(n>=2) to_binary(n/2);
	putchar('0'+r);
	return;
}
原文地址:https://www.cnblogs.com/xkf97/p/12586268.html