算法-递归算法

一、递归算法

  一个函数调用其自身就是递归函数。

  递归的作用:
  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\n", src, dest);
        return; 
    }    
    Hanoi( n-1, src, dest, mid );// 先从src移动n-1个盘子到mid
    printf("%c -> %c\n", 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\n", Factorial(n));
    
    printf("Fibonoci: ");
    scanf("%d", &n);
    printf("%d\n", 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

 

posted @ 2020-08-03 23:12  LeonYi  阅读(278)  评论(0编辑  收藏  举报