Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2538675
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2011-04-25 11:44:21

    递归与分治思想往往是相伴而生的,在各种算法中使用很频繁。分治算法的思想是,解决一些规模较大的问题,常常将问题进行分解,将大规模的问题,分割成规模较小的同类问题,然后将这些小的子问题逐个解决,最终也就将整个大的问题解决了。
    计算n的阶乘。因为n的阶乘为n*(n-1)的阶乘,而零的阶乘为1。因此我们可以使用递归的算法进行求解,代码如下:
  1. #include <stdio.h>

  2. /*计算n的阶乘*/
  3. int factorial(int n)
  4. {
  5.   if (n == 0)
  6.   {
  7.     return 1;
  8.   }
  9.   else
  10.   {
  11.     return n * factorial(n-1);
  12.   }
  13. }

  14. int main(int argc, char* argv[])
  15. {
  16.   int i,result;
  17.   printf("please input a number:");
  18.   scanf("%d",&i);
  19.   result = factorial(i);
  20.   printf("result: %d! = %d\n",i,result);
  21.   
  22.   return 0;
  23. }
计算整数的划分数。将一个正整数n表示程一系列的正整数之和,此问题的解决,也需要使用分治的算法进行解决,代码如下:
  1. #include <stdio.h>

  2. /*计算输入的正整数n的划分数*/
  3. int P(int n, int m)
  4. {
  5.   if (m == 1 || n == 1) return 1;
  6.   if(m > n) return P(n, n);
  7.   if(m == n) return 1 + P(n, m - 1);
  8.   return P(n, m - 1) + P(n - m, m);
  9. }

  10. int main(int argc, char* argv[])
  11. {
  12.   int n,s;
  13.   printf("please input a integer for getting the number of division\n");
  14.   scanf("%d",&n);
  15.   s = P(n, n);
  16.   printf("the number of division of %d is %d\n",n,s);
  17.   
  18.   return 0;
  19. }
    分治算法的经典案例也就是递归的折半查找算法,此算法的前提是,数组中的元素排列顺序要不递增,要不递减。然后才可以使用此算法,代码如下:
  1. #include <stdio.h>

  2. /*递归的折半查找算法*/
  3. int bin_search(int key[], int low, int high, int k)
  4. {
  5.   int mid;
  6.   if(low > high)
  7.   {
  8.     return -1;
  9.   }
  10.   else
  11.   {
  12.     mid = (low + high) / 2;
  13.     if(key[mid] == k)
  14.     {
  15.       return mid;
  16.     }
  17.     
  18.     if(k > key[mid])
  19.     {
  20.       return bin_search(key, mid + 1, high, k);
  21.     }
  22.     else
  23.     {
  24.       return bin_search(key, low, mid - 1,k);
  25.     }
  26.   }
  27. }

  28. int main(int argc, char* argv[])
  29. {
  30.   int n,i,addr;
  31.   int A[11] = {1,2,3,4,5,6,7,8,9,10,11};
  32.   printf("the contents of the array A[11] are\n");
  33.   for(i=0;i<11;i++)
  34.   {
  35.     printf("%d ",A[i]);
  36.   }
  37.   printf("\nplease input a integer for search\n");
  38.   scanf("%d",&n);
  39.   addr = bin_search(A, 0, 11, n);
  40.   if (-1 != addr)
  41.   {
  42.     printf("%d is at the %dth unit is arry A\n", n,addr);
  43.   }
  44.   else
  45.   {
  46.     printf("there is no %d in array A\n", n);
  47.   }
  48.   
  49.   return 0;
  50. }
折半查找算法的执行结果如下:
peng@ubuntu:~/src/test/c/suanfa/miaoqu$ ./3.7
the contents of the array A[11] are
1 2 3 4 5 6 7 8 9 10 11
please input a integer for search
3
3 is at the 2th unit is arry A

阅读(2964) | 评论(0) | 转发(0) |
0

上一篇:穷举法思想

下一篇:贪心算法思想

给主人留下些什么吧!~~