递归:
一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数
分治思想:
将一个问题分为几个小的模块,逐一解决
输入任意长度的字符,并反向输出(递归):
#include <stdio.h>
void print()
{
char a;
scanf("%c", &a);
if( '#' != a )
{
print();
}
if( '#' != a )
{
printf("%c", a);
}
}
int main(void)
{
printf("Please enter the string and enter # to end:\n");
print();
printf("\n");
return 0;
}
斐波那契数列实现(迭代+递归)
/*斐波拉契数列*/
#include <stdio.h>
int Recur(int n);
/*迭代算法实现*/
int main(void)
{
int i;
int a[40];
int b[40];
a[0] = 1;
a[1] = 1;
printf("%d %d ", a[0], a[1]);
for(i=2 ; i<40 ; i++)
{
a[i] = a[i-1]+a[i-2];
printf("%d ", a[i]);
}
printf("\n");
for(i=0 ; i<40 ; i++)
{
b[i] = Recur(i);
printf("%d ", b[i]);
}
printf("\n", b[39]);
return 0;
}
/*递归算法实现*/
int Recur(int n)
{
int num;
if(n < 2)
{
num = 1;
}
else
{
num = Recur(n-1) + Recur(n-2);
}
return num;
}
折半查找(迭代和递归)
#include <stdio.h>
#define MAXSIZE 10
int a[MAXSIZE] = {1,11,21,31,41,51,61,71,81,91};
int max = MAXSIZE - 1, min = 0, mid;
void HalfHold(int a[], int b)
{
mid = (max+min)/2;
if(mid == max || mid == min)
{
if(a[mid] != b)
{
printf("The value is not in the array!\n");
return;
}
}
if(a[mid] > b)
{
max = mid;
mid = (min+max) / 2;
HalfHold(a, b);
}
else if(a[mid] < b)
{
min = mid;
mid = (min+max) / 2;
HalfHold(a, b);
}
else if(a[mid] == b)
{
printf("The number of the value is %d\n", mid);
return;
}
}
int main(void)
{
int b;
int max, min, mid;
printf("Please enter the value:\n");
scanf("%d", &b);
min = 0;
max = 9;
mid = (min+max) / 2;
while(mid != max && mid != min)
{
if (a[mid] > b)
{
max = mid;
mid = (min+max) / 2;
}
else if (a[mid] < b)
{
min = mid;
mid = (min+max) / 2;
}
else if (a[mid] == b)
{
printf("The number of the value is %d\n", mid);
break;
}
/*
if (mid == max || mid == min)
{
if(a[mid] != b)
{
printf("The value is not in the array!\n");
break;
}
}
*/
}
if(a[mid] != b)
{
printf("The value is not in the array!\n");
}
HalfHold(a, b);
return 0;
}
汉诺塔问题:
#include <stdio.h>
void move(int n, char x, char y, char z)
{
if( 1 == n )
{
printf("%c-->%c\n", x, z);
}
else
{
move(n-1, x, z, y); //将n-1个盘子从x借助z移到y上
printf("%c-->%c\n", x, z); //将第n个盘子从x移到z上
move(n-1, y, x, z); //将n-1个盘子从y借助x移到z上
}
}
int main(void)
{
int d;
printf("Please enter the number of the hanoi:\n");
scanf("%d", &d);
printf("Here is the result:\n");
move(d, 'X', 'Y', 'Z');
return 0;
}
八皇后问题:
#include <stdio.h>
#include <stdlib.h>
int count = 0;
int notDanger(int row, int j, int(*chess)[8])
{
int i, k;
int flag = 0;
//判断列方向是否危险
for(i=0; i<8; i++)
{
if(*(*(chess+i)+j) != 0)
{
flag = 1;
break;
}
}
//判断左上方
for(i=row, k=j; i>=0 && k>=0; i--, k--)
{
if(*(*(chess+i)+k) != 0)
{
flag = 1;
break;
}
}
//判断右下方
for(i=row, k=j; i<8 && k<8; i++, k++)
{
if(*(*(chess+i)+k) != 0)
{
flag = 1;
break;
}
}
//判断右上方
for(i=row, k=j; i>=0 && k<8; i--, k++)
{
if(*(*(chess+i)+k) != 0)
{
flag = 1;
break;
}
}
//判断左下方
for(i=row, k=j; i<8 && k>=0; i++, k--)
{
if(*(*(chess+i)+k) != 0)
{
flag = 1;
break;
}
}
if( flag )
{
return 0;
}
else
{
return 1;
}
}
void EightQueen(int row, int col, int (*chess)[8])
{
int chess2[8][8], i, j;
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
chess2[i][j] = chess[i][j];
}
}
if( 8 == row ) //打印结果
{
printf("The %d's result:\n", count+1);
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
printf("%d ", *(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
count++;
}
else
{
//判断这位置是否有危险
for(j=0; j<col; j++)
{
if( notDanger(row, j, chess2) )
{
for(i=0; i<8; i++) //先将该行所有数赋值0
{
*(*(chess2+row)+i) = 0;
}
*(*(chess2+row)+j) = 1; //再将判断不危险的位置赋值1
EightQueen(row+1, col, chess2); //重点理解区域
}
}
}
}
int main(void)
{
int chess[8][8], i, j;
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
chess[i][j] = 0;
}
}
EightQueen(0, 8, chess);
printf("There are %d results\n", count);
return 0;
}