赞
踩
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
------来自百度
总结:递归的过程重在分析,先向下寻找找出出口条件,然后依次回退解决当前问题。
三要素参考博客:http://blog.csdn.net/sinat_32547403/article/details/74934897
递归的要素:
如果我们将出口改成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));
}
- int func(int n)
- {
- if(n<0)
- return -1;
- if( n==0 )
- return 1;
- if( n > 0 )
- return n*func(n-1);
- }
-
- void main()
- {
- printf("%d",func(10));
- }
- int func(int n)
- {
- if( n==1 || n==2 )
- return 1;
- if( n > 2 )
- return func(n-1) + func(n-2);
- }
-
- void main()
- {
- printf("%d",func(5));
- }
- int func(int i)
- {
- if( i == 1 )
- return 1;
- if( i > 1 )
- return 2*(func(i-1) + 1);
- }
-
- void main()
- {
- printf("%d",func(4));
- }
- //汉诺塔的实现
- //思想:1.出口条件N=1,直接把a移到c
- // 2.先将a上前n-1个盘子通过c移到b
- // 3.然后把a上的盘子移到c
- // 4.最后把b上的n-1个盘子通过a移到c完成跳出
- /*void haino(int n ,int a ,int b ,int c)
- {
- if( n == 1 )
- printf("把%d移到%d\n",a,c);
- if( n > 1 )
- {
- haino(n-1,a,c,b);
- printf("把%d移到%d\n",a,c);
- haino(n-1,b,a,c);
- }
- }
-
- void main()
- {
- int a = 1,b = 2,c = 3;
- haino(5,a,b,c);
- } */
- //快速排序
- /*void swap(int *arr,int i,int j)
- {
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- void print(int *arr,int len)
- {
- int i;
- for(i=0;i<len;i++)
- {
- printf("%d ",arr[i]);
- }
- }
- int quick(int *arr ,int low,int high)
- {
- int temp = arr[low];
- int len = high;
- if( low < high )
- {
- while( low < high )
- {
- while( ( low<high ) && ( arr[high]>= temp ) )
- {
- high--;
- }
- swap(arr,low,high);
- while( ( low<high ) && ( arr[low]<= temp ) )
- {
- low++;
- }
- swap(arr,low,high);
- }
- quick(arr,0,low);
- quick(arr,low+1,len);
- }
- return low;
- }
- void main()
- {
- int arr[] = {5,7,6,3,1,9,8,4,2,0};
- int len = sizeof(arr)/sizeof(*arr);
-
- quick(arr,0,len-1);
-
- print(arr,len);
- }
- #include <stdio.h>
- //存坐标
- int index[8] = {0};
- //存次数
- int count=0;
- //打印函数
- void print()
- {
- int i = 0,j = 0;
- printf("\n");
- for(i=0;i<8;i++)
- {
- for(j=0;j<index[i];j++)
- printf("*");
- printf("#");
- for(;j<8;j++)
- printf("*");
- printf("\n");
- }
- printf("-----------------------%d",count++);
- }
- //检查是否可放
- int check(int row,int col)
- {
- int i = 0;
- int local;
- for(i=0;i<row;i++)
- {
- local = index[i];
- //同行同列
- if(col == local)
- return 0;
- //纵向重合
- if( (local + i) == (row + col) )
- return 0;
- if( (local - i) == (col - row) )
- return 0;
- }
-
- return 1;
- }
-
- void queue(int row)
- {
- int i = 0;
-
- for(i=0 ;i<8 ;i++)
- {
- //位置0-7递增判断是否可放皇后
- //如果上一次检查无误
- if( check(row,i) ){
- //放入皇后位置
- index[row] = i;
- //判断是否到8行
- if( row == 7 )
- {
- //打印
- print();
- index[row] = 0;
- return ;
- }
- //没有完成,行数递增
- queue(row+1);
- index[row] = 0;
- }
- }
- }
-
- int main()
- {
- queue(0);
- print();
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。