递归的数学思想
- 递归是一种数学上分而自治的思想
- 递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理
- 递归需要有边界条件
- 当边界条件不满足时,递归继续进行
- 当边界条件满足时,递归停止
递归的数学表示

应用
斐波拉契数列递归解法

int fibonacci(int n)
{
if(n > 1)
{
return fibonacci(n-1) + fibonacci(n-2);
}
else if(n == 1)
{
return 1;
}
else if(n == 0)
{
return 0;
}
}
strlen递归解法
Strlen("12345")
Strlen("2345") + 1
(Strlen("345") + 1) + 1
((Strlen("45") + 1) + 1) + 1
((((Strlen("") + 1) + 1) + 1) + 1) + 1
int strlen(const char* szStr)
{
if( szStr == NULL )
{
return -1;
}
else if( *szStr == '\0' )
{
return 0;
}
else
{
return strlen( szStr + 1) + 1;
}
}
汉诺塔递归解法

int hanno(int n, char a, char b, char c)
{
if( n > 0 )
{
if( n == 1 )
{
printf("%c - %c \n",a,c);
}
else
{
hanno(n-1, a, c, b);
printf("%c - %c \n",a,c);
hanno(n-1, b, a, c);
}
}
}
全排列递归解法

int permutation(char a[], int b. int e)
{
if( ( 0 <= b ) && ( b <= e ) )
{
if( b == e )
{
printf("%s\n",s);
}
else
{
int i;
for( i = b; i <= e; i++)
{
char c = a[b];
a[b] = a[i];
a[i] = c;
permutation(a, b+1, e);
c = a[b];
a[b] = a[i];
a[i] = c;
}
}
}
}
去重全排列
// 从第一个数字起每个数分别与它后面非重复出现的数字交换
// 第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数
int IsSwap(char a[], int b, int e)
{
for (int i = b; i < e; i++)
if (a[i] == a[e])
return 0;
return 1;
}
int permutation(char a[], int b. int e)
{
if( ( 0 <= b ) && ( b <= e ) )
{
if( b == e )
{
printf("%s\n",s);
}
else
{
int i;
for( i = b; i <= e; i++)
{
if(IsSwap(a, b, i))
{
char c = a[b];
a[b] = a[i];
a[i] = c;
permutation(a, b+1, e);
c = a[b];
a[b] = a[i];
a[i] = c;
}
}
}
}
}
小结
- 递归是一种将问题分而自治的思想
- 用递归解决问题首先要建立递归的模型
- 递归解法必须要有边界条件,否则将死循环