函数参数
实参:真实传给函数的参数叫做实参。
形参:形式参数只在函数中有效。
exp:交换两个数值
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
在Swap1中并没有进行值得交换,这是因为传递的值还是num1和num2,但是形参和实参的地址不一样,所以值并没有被真实传送。
在Swap中,进行了交换因为传递的是地址的值,而并没那个数。
函数递归(算法为主)
递归做为一种算法在程序设计语言中广泛应 用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复 杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可 描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在 于:把大事化小
递归的两个必要条件
1.存在限制条件,当满足这个限制条件后不再继续。
2.每次递归调用后,越来越接近这个限制条件。
exp 1 接受一个整型值(无符号)按照顺序打印它的每一位。 例如输入1234,1.输出 1 2 3 4, 2.输出为4,3,2,1,
// 正序
int Print(unsigned int n)
{
if (n > 9)
{
Print(n / 10);
}
Sleep(1000);
return printf("\b%d", n % 10);
}
// 倒序
void Print2(unsigned int n)
{
if (n >= 10)
{
printf("%d", n % 10);
Print2(n / 10);
}
else
{
printf("%d", n);
}
}
exp2 求n的阶乘 使用递归求n的阶乘时必须先算出每个项的前一项值,时间代打大。因此,并不是每个算法都要使用递归,有时循环更佳。例如求n个斐波那契
int factioral(int n)
{
if (n <= 1)
{
return printf("%d", n);
}
else
{
return factioral(n - 1) * n;
}
}
exp3 使用递归求n个斐波那契; 当n=50时,运行时间过长,因此宜使用循环
int Fib(int n)
{
if (n < 3)
{
return 1;
}
else
return Fib(n - 1) + Fib(n - 2);
}
exp4 使用循环求n个斐波那契
int Fib_For(int n)
{
int third=2, first=1,second=1,tmp;
if (n < 3)
return 1;
else
{
for (int i = 3; i < n; i++)
{
first = second;
second = third;
third = first + second;
}
return third;
}
}
注意:
- 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
- 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
- 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。