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");
}

输出结果

posted @ 2023-06-28 19:50  明天再取个名字  阅读(17)  评论(0)    收藏  举报