递归
来源:互联网 发布:js根据下标删除数组 编辑:程序博客网 时间:2024/04/27 21:46
直接或间接调用自己的函数称为递归函数。一个简单的递归函数例子是阶乘的计算。数 n 阶乘是从 1 到 n 的乘积。例如,5 的阶乘就是 120。
1 * 2 * 3 * 4 * 5 = 120
解决这个问题的自然方法就是递归:
// calculate val!, which is 1*2 *3 ... * val
int factorial(int val)
{
if (val > 1)
return factorial(val-1) * val;
return 1;
}
递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽。有时候,这种现象称为“无限递归错误”。对于函数 factorial,val 为 1 是终止条件。
另一个例子是求最大公约数的递归函数:
// recursive version greatest common divisor program
int rgcd(int v1, int v2)
{
if (v2 != 0) // we're done once v2 gets to zero
return rgcd(v2, v1%v2); // recurse, reducing v2 on each call
return v1;
}
这个例子中,终止条件是余数为 0。如果用实参 (15, 123) 来调用 rgcd 函数,结果为 3。
rgcd(15, 123) 的跟踪过程
v1 v2 Return
15 123 rgcd(123, 15)
123 15 rgcd(15, 3)
15 3 rgcd(3, 0)
3 0 3
最后一次调用:
rgcd(3,0)
1 * 2 * 3 * 4 * 5 = 120
解决这个问题的自然方法就是递归:
// calculate val!, which is 1*2 *3 ... * val
int factorial(int val)
{
if (val > 1)
return factorial(val-1) * val;
return 1;
}
递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽。有时候,这种现象称为“无限递归错误”。对于函数 factorial,val 为 1 是终止条件。
另一个例子是求最大公约数的递归函数:
// recursive version greatest common divisor program
int rgcd(int v1, int v2)
{
if (v2 != 0) // we're done once v2 gets to zero
return rgcd(v2, v1%v2); // recurse, reducing v2 on each call
return v1;
}
这个例子中,终止条件是余数为 0。如果用实参 (15, 123) 来调用 rgcd 函数,结果为 3。
rgcd(15, 123) 的跟踪过程
v1 v2 Return
15 123 rgcd(123, 15)
123 15 rgcd(15, 3)
15 3 rgcd(3, 0)
3 0 3
最后一次调用:
rgcd(3,0)