递归与迭代

兔子数列,也就是斐波那契数列,我们不妨列出几项:1,1,2,3,5,8,13......其通项为

递归与迭代_第1张图片

通项看起来似乎很奇怪,而如果让我们利用c语言来写出该数列的第100项,我们该如何思考呢?

对斐波那契数列的探究

对于此数列,我们不难看出从第三项开始,每一项的值都为前两项斐波那契数之和,故我们可以得到斐波那契的递推公式

a1=1,a2=1,a3=2...an=a(n-1)+a(n-2)

在没有学习递归的情况下,我们可以尝试通过循环的方式将逐步将所求的a值求出

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

像这样,通过值的替换来求出斐波那契数。

其实,通过后续的学习我们可以了解到,这种循环属于迭代中的一种。

在学习了递归后,我们可以用递归的方法十分简单地求值。

递归

递归,在c语言中意思是函数的调用,即通过多次调用函数,达到简化解题过程的一种方法。

int main()
{
    printf("haha");
    main();
    return 0;
}

这就可以叫做递归,但这个递归会栈溢出,只是起到一个演示的作用。

言归正传,对于斐波那契数列的求解,我们直接用其递推公式可得

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

十分简洁好想,但是这样会有缺点,就是计算效率不高,计算机每次计算都需要重复调用函数,将之前计算过的再计算一遍,所以对于递归和迭代的利用,我们要结合实际情况来看,前者想计算50位都已经很慢了,后者却可以很快的计算出100位甚至200位。

递归练习

递归与迭代_第2张图片

int Pow(int n, int k)
{
	if(k==0)
		return 1;
	else if(k>=1)
	{
		return n*Pow(n, k-1);
	}
}

n*Pow(n, k-1)会让n一直为n,然后与n相乘,直到k为0。

递归与迭代_第3张图片

int DigitSum(int n)//1729
{
	if(n>9)
		return DigitSum(n/10)+n%10;
	else
		return n;
}

一步一步地循环,将该数据的最后一位打出来然后相加。

你可能感兴趣的:(算法)