一、递归算法
一个函数调用其自身就是递归函数。
递归的作用:
1) 替代多重循环
2) 解决本来就是用递归形式定义的问题
3) 将问题分解为规模更小的子问题进行求解
递归的基本法则:
1) 存在一些基准情形,无需递归就能直接求解
2) 递归函数总是向着基准情形推荐
具体例子如下: a)汉诺塔 b)阶乘 c)斐波那契数列
// 汉诺塔n个盘子,将盘子从src座移到dest座,以mid为终点站
void Hanoi( int n, char src, char mid, char dest )
{
if ( n == 1 ) { // 一个盘子
printf("%c -> %c
", src, dest);
return;
}
Hanoi( n-1, src, dest, mid );// 先从src移动n-1个盘子到mid
printf("%c -> %c
", src, dest); // 将大盘子从src移到dest
Hanoi( n-1, mid, src, dest );// 最后从mid移动n-1个盘子到dest
return;
}
int Factorial( int n )
{
if ( n == 0) {
return 1;
}
return n * Factorial( n-1 );
}
int Fibonacci(int n)
{
if ( n == 0 || n == 1 ) {
return 1;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int fibo(int n)
{ // 动态规划版
if (n < 1)
return -1;
int F[n+1];
F[1] = 1;
F[2] = 1;
for (int i = 3; i <= n; i++) {
F[i] = F[i-1] + F[i-2];
}
return F[n];
}
int main(int argc, char *argv[])
{
int n;
printf("Factorial: ");
scanf("%d", &n);
printf("%d
", Factorial(n));
printf("Fibonoci: ");
scanf("%d", &n);
printf("%d
", Fibonacci(n));
printf("Hanoi: ");
scanf("%d", &n);
Hanoi( n, 'A', 'B', 'C' );
return 0;
}
d) 求幂(python版)- 主要是利用tmp存储中间变量,避免重复计算
def pow(x, y):
if 0 <= y <= 1:
return x if y == 1 else 1
elif y > 1:
if y % 2 == 0:
tmp = pow(x, y // 2)
return tmp * tmp
else:
return pow(x, y - 1) * x