当前位置:   article > 正文

递归算法大全_常见递归算法

常见递归算法
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后 递归调用函数(或过程)来表示问题的解。

一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).

                                                                                                                                     ------来自百度

总结:递归的过程重在分析,先向下寻找找出出口条件,然后依次回退解决当前问题。

三要素参考博客:http://blog.csdn.net/sinat_32547403/article/details/74934897

递归的要素:

  • 一定有一种可以退出程序的情况;!!!(必须存在出口条件)
  • 总是在尝试将一个问题化简到更小的规模(存在一个可以有限次细化的解决问题的公式)
  • 父问题与子问题不能有重叠的部分(如果全部重叠将无法跳出循环递归,导致程序崩溃)
问题抛出:
求1~n这n个数的和,求n的阶乘,斐波拉契数列,猴子吃桃,年龄问题。
汉诺塔,快速排序,八皇后(待更新)

分析问题:第一排问题,仔细分析后发现它们都存在一个解决问题的公式,目前我们就称这类问题为计算类递归。这种问题很容易分析出结论来。
第二排问题存在应用场景,汉诺塔,八皇后是经典的递归,八皇后牵扯到了回朔问题,快速排序需要递归的调用以前的应用场景。这些问题都是将大我分解成了小我最后都是单元素的处理。

<一>

1.求1~n这n个数的和。

这个问题和出口的设定关系极大,因为当他找到它递归的出口时,它便会立刻进行回退。
分析如图:


如果我们将出口改成func(2)=3,他就会提前递归跳出。

所以正确且有效的出口至关重要。

#include<stdio.h>

// N个数求和 
//思想:1.出口条件:N=0
//     2.func(c) = c + func(c-1);
//依次累加求和,同类:求阶乘,斐波拉契数列,猴子吃桃。 
int func(int i)
{
	int n = 0;

	if( i == 1 )
	{
		return 1;
	}
	if( i >= 1 )
	{
		return i + func(i-1);	
	}	
}

void main()
{
	printf("%d",func(3));	
}

2.求n的阶乘

c语言代码实现:
  1. int func(int n)
  2. {
  3. if(n<0)
  4. return -1;
  5. if( n==0 )
  6. return 1;
  7. if( n > 0 )
  8. return n*func(n-1);
  9. }
  10. void main()
  11. {
  12. printf("%d",func(10));
  13. }

3.斐波拉契数列

c语言实现
  1. int func(int n)
  2. {
  3. if( n==1 || n==2 )
  4. return 1;
  5. if( n > 2 )
  6. return func(n-1) + func(n-2);
  7. }
  8. void main()
  9. {
  10. printf("%d",func(5));
  11. }

4.猴子吃桃

  1. int func(int i)
  2. {
  3. if( i == 1 )
  4. return 1;
  5. if( i > 1 )
  6. return 2*(func(i-1) + 1);
  7. }
  8. void main()
  9. {
  10. printf("%d",func(4));
  11. }


5.年龄问题

有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。
分析本题也只是将n个数求和的出口改成了最后一个人的年龄10;
求解方法和求和大同小异不做赘述。

<二>

1.汉诺塔

  1. //汉诺塔的实现
  2. //思想:1.出口条件N=1,直接把a移到c
  3. // 2.先将a上前n-1个盘子通过c移到b
  4. // 3.然后把a上的盘子移到c
  5. // 4.最后把b上的n-1个盘子通过a移到c完成跳出
  6. /*void haino(int n ,int a ,int b ,int c)
  7. {
  8. if( n == 1 )
  9. printf("把%d移到%d\n",a,c);
  10. if( n > 1 )
  11. {
  12. haino(n-1,a,c,b);
  13. printf("把%d移到%d\n",a,c);
  14. haino(n-1,b,a,c);
  15. }
  16. }
  17. void main()
  18. {
  19. int a = 1,b = 2,c = 3;
  20. haino(5,a,b,c);
  21. } */

2.快速排序

  1. //快速排序
  2. /*void swap(int *arr,int i,int j)
  3. {
  4. int temp = arr[i];
  5. arr[i] = arr[j];
  6. arr[j] = temp;
  7. }
  8. void print(int *arr,int len)
  9. {
  10. int i;
  11. for(i=0;i<len;i++)
  12. {
  13. printf("%d ",arr[i]);
  14. }
  15. }
  16. int quick(int *arr ,int low,int high)
  17. {
  18. int temp = arr[low];
  19. int len = high;
  20. if( low < high )
  21. {
  22. while( low < high )
  23. {
  24. while( ( low<high ) && ( arr[high]>= temp ) )
  25. {
  26. high--;
  27. }
  28. swap(arr,low,high);
  29. while( ( low<high ) && ( arr[low]<= temp ) )
  30. {
  31. low++;
  32. }
  33. swap(arr,low,high);
  34. }
  35. quick(arr,0,low);
  36. quick(arr,low+1,len);
  37. }
  38. return low;
  39. }
  40. void main()
  41. {
  42. int arr[] = {5,7,6,3,1,9,8,4,2,0};
  43. int len = sizeof(arr)/sizeof(*arr);
  44. quick(arr,0,len-1);
  45. print(arr,len);
  46. }

3.八皇后

  1. #include <stdio.h>
  2. //存坐标
  3. int index[8] = {0};
  4. //存次数
  5. int count=0;
  6. //打印函数
  7. void print()
  8. {
  9. int i = 0,j = 0;
  10. printf("\n");
  11. for(i=0;i<8;i++)
  12. {
  13. for(j=0;j<index[i];j++)
  14. printf("*");
  15. printf("#");
  16. for(;j<8;j++)
  17. printf("*");
  18. printf("\n");
  19. }
  20. printf("-----------------------%d",count++);
  21. }
  22. //检查是否可放
  23. int check(int row,int col)
  24. {
  25. int i = 0;
  26. int local;
  27. for(i=0;i<row;i++)
  28. {
  29. local = index[i];
  30. //同行同列
  31. if(col == local)
  32. return 0;
  33. //纵向重合
  34. if( (local + i) == (row + col) )
  35. return 0;
  36. if( (local - i) == (col - row) )
  37. return 0;
  38. }
  39. return 1;
  40. }
  41. void queue(int row)
  42. {
  43. int i = 0;
  44. for(i=0 ;i<8 ;i++)
  45. {
  46. //位置0-7递增判断是否可放皇后
  47. //如果上一次检查无误
  48. if( check(row,i) ){
  49. //放入皇后位置
  50. index[row] = i;
  51. //判断是否到8行
  52. if( row == 7 )
  53. {
  54. //打印
  55. print();
  56. index[row] = 0;
  57. return ;
  58. }
  59. //没有完成,行数递增
  60. queue(row+1);
  61. index[row] = 0;
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. queue(0);
  68. print();
  69. return 0;
  70. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/916256
推荐阅读
相关标签
  

闽ICP备14008679号