1001_按步奏使用递归解决问题
最近发现、有时候直接写出递归函数比较困难,于是想到下面的做法来写递归:
先使用循环来解决问题,再将循环改成递归即可。
以 Fibonacci 数列为例。
第一步:使用循环来实现(宜用 while 循环、方便直观的找到循环结束条件)
// 打印Fibonacci 数列的前 n 项
int Fibonacci_List(unsigned int n)
{
unsigned int a[3] = {0, 1, 1};
n -= 2;
printf("%d, %d, ", a[0], a[1]);
while(n > 0)
{
a[2] = a[0] + a[1];
printf("%d, ", a[2]);
a[0] = a[1];
a[1] = a[2];
n--;
}
}
第二步:在递归函数里面构造循环
int Fibonacci_List_r(unsigned int n)
{
if(n == 0)
{
return 0;
}else{
Fibonacci_List_r(n - 1);
}
}
第三步:写完递归、实现函数功能
void Fibonacci_List_r(unsigned int n, unsigned int *P0, unsigned int *P1)
{
if(n <= 2)
{
*P0 = 0;
*P1 = 1;
printf("%d, %d, ", *P0, *P1);
return;
}else{
Fibonacci_List_r(n - 1, P0, P1);
int P2 = *P0 + *P1;
*P0 = *P1 ;
*P1 = P2;
printf("%d, ", P2);
}
}
// 打印Fibonacci 数列的前 n 项
int Fibonacci_List(unsigned int n)
{
unsigned int P0, P1;
Fibonacci_List_r(n, &P0, &P1);
}
完整代码
// 获取第 n 个 Fibonacci 数值
int Fibonacci_Get_Element(unsigned int n)
{
if(n == 0)
{
return 0;
}else if(n == 1){
return 1;
}else{
return Fibonacci_Get_Element(n - 1) + Fibonacci_Get_Element(n - 2);
}
}
void Fibonacci_List_r(unsigned int n, unsigned int *P0, unsigned int *P1)
{
if(n <= 2)
{
*P0 = 0;
*P1 = 1;
// 这里作为循环退出条件、只会执行一次,所以只会打印一次
printf("%d, %d, ", *P0, *P1);
return;
}else{
Fibonacci_List_r(n - 1, P0, P1);
int P2 = *P0 + *P1;
*P0 = *P1 ;
*P1 = P2;
printf("%d, ", P2);
}
}
// 打印Fibonacci 数列的前 n 项
int Fibonacci_List(unsigned int n)
{
#if 1
unsigned int P0, P1;
Fibonacci_List_r(n, &P0, &P1);
#else
unsigned int a[3] = {0, 1, 1};
n -= 2;
printf("%d, %d, ", a[0], a[1]);
while(n > 0)
{
a[2] = a[0] + a[1];
printf("%d, ", a[2]);
a[0] = a[1];
a[1] = a[2];
n--;
}
#endif
}
void c_Funtest_Fibonacci(void)
{
int i;
printf("\r\n\r\n======= Fibonacci test =======\r\n\r\n");
for(i = 0; i < 10; i++)
{
int F;
F = Fibonacci_Get_Element(i);
printf("F(%d) = %d\r\n", i, F);
}
printf("\r\n");
while(1)
{
int n;
scanf("%d", &n);
Fibonacci_List(n);
printf("\r\n\r\n");
}
printf("\r\n");
}
输出结果


浙公网安备 33010602011771号