0
点赞
收藏
分享

微信扫一扫

函数和递归(3)

1.递归与迭代:

求n的阶乘(不考虑溢出):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int factorial(int a)
{
	if (a <= 1)
		return 1;
	else
		return a * factorial(a - 1);
}

int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", factorial(n));
	return 0;
}


求第n个斐波那契数(不考虑溢出):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int Fib(int a)
{
	if (a <= 2)
		return 1;
	else
		return Fib(a - 1) + Fib(a - 2);
}

int main()
{
	int n;
	scanf("%d", &n);
	printf("第n个斐波那契数列为>: %d\n",Fib(n));
	return 0;
}

正常来说,采用这样的递归思想来实现计算是可行的,但是效率太低了。

当想要求出第50个斐波那契数的大小时已经溢出无法计算了。

函数和递归(3)_赋值

由上图可以直观地看到当我们要计算第50个斐波那契数的时候,往下拆分,

会发现有很多数被重复计算了,这无疑会产生极大的资源浪费。

那么我们该如何优化呢?


为避免出现重复的情况,那我们可以将每次计算的结果保留,

下图思路就是如此,第一个数字1赋值给a,第二个数字1赋值给b,

再用a+b算出c(第三个斐波那契数),或者直接给c赋值上2.

算出c后,把b赋值给a,c再赋值给b,接着算出c(第四个斐波那契数)

如此循环,想象成abc就是一组滑块,顺着往下一一对应。

函数和递归(3)_赋值_02

按照这样一个思路,我们不难写出如下优化后的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int Fib(int x)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while (x > 2)
    {
        c = a + b;
        a = b;
        b = c;
        x--;
    }
    return c;
}

int main()
{
    int n;
    scanf("%d", &n);
    printf("第n个斐波那契数为>: %d\n", Fib(n));
    return 0;
}



举报

相关推荐

0 条评论