递归算法的时间复杂度的分析方法

一、前置疑问

Q1、什么是递归
Q2、如何分析递归算法

二、学习内容

1、递归的定义

递归是一种直接调用自己或者间接调用自身的方法。递归由两个部分组成。

  1. 基础情况:即最简单情况时可以直接输出,是递归出口。
  2. 递归部分:递归部分的类型和整个类型是相同的。

2、几个常见的递归程序

  1. 斐波那契数列
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int Fibonacci(int num)
  5 {
  6     if(num <= 1)
  7         return num;
  8     else
  9         return Fibonacci(num-2)+Fibonacci(num-1);
 10 }
 11 
 12 int main(void)
 13 {
 14     int num;
 15     scanf("%d",&num);
 16     num = Fibonacci(num);
 17     printf("%d\n",num);
 18     exit(0);
 19 }
  1. 欧几里德递归算法,求出最大公约数
   1 #include 
  2 #include 
  3 
  4 void Swap(int *a, int *b)
  5 {
  6     int c = *a;
  7     *a = *b;
  8     *b = c;
  9 }
 10 
 11 int RGcd(int m, int n)
 12 {
 13     if(m == 0)
 14         return n;
 15     return RGcd(n%m, m);
 16 }
 17 
 18 int Gcd(int m, int n)
 19 {
 20     if(m < n)
 21         Swap(&m, &n);
 22     return RGcd(m, n);
 23 
 24 }
 25 
 26 int main(void)
 27 {
 28     int a, b, c;
 29     scanf("%d%d",&a, &b);
 30     c = Gcd(a, b);
 31     printf("%d\n", c);
 32 
 33     exit(0);
 34 }
  1. 汉诺塔
  1 #include 
  2 #include 
  3 
  4 void Move(int n, char x, char y)
  5 {
  6     printf("The disk %d is moved from %c ---> %c\n",n,x,y);
  7 
  8 }
  9 
 10 void Hanoi(int n, char x, char y, char z)
 11 {
 12     if(n)
 13     {
 14         Hanoi(n-1, x, z, y);
 15         Move(n, x, y);
 16         Hanoi(n-1, z, y, x);
 17 
 18     }
 19 }
 20 
 21 
 22 int main(void)
 23 {
 24 
 25     int num;
 26     scanf("%d",&num);
 27     Hanoi(num, 'x', 'y', 'z');
 28 
 29 
 30     exit(0);
 31 }

3、分析方法

首先了解什么是递推方程,递推方程是自然数上一个函数T(n), 它使用一个或多个小于n时的值的等式或者不等式来描述。也称为递归式或递推关系。
通常用递推方程来计算时间复杂度。

3.1 迭代法

  1. 计算和式:将递推式进行扩展,转变一个和式,通过计算和式来算出渐近复杂度,以Hanoi算法来进行演示。
    递归算法的时间复杂度的分析方法_第1张图片

  2. 递归树:可以形象的看到递推的过程,也属于迭代法,下面两道例题说明。
    递归算法的时间复杂度的分析方法_第2张图片
    递归算法的时间复杂度的分析方法_第3张图片

3.2 替换法

替换法首先要求猜测递推式的解,然后用归纳法证明。下面给出详细信息。
递归算法的时间复杂度的分析方法_第4张图片

3.3 主方法(master method)

递归算法的时间复杂度的分析方法_第5张图片
递归算法的时间复杂度的分析方法_第6张图片
下次给出主方法的证明。

你可能感兴趣的:(算法设计与分析,算法)