尾递归和递归

#include <stdio.h>
#include <stdlib.h>

 int fun(int n)//递归
{
	if(n<0)
	{
		return 0;
	}
	if(n==1||n==0)
	{
		return 1;
	}
	else
	{
		return n*fun(n-1);
	}
}
int fun1(int n,int a)//尾递归
{
		if(n==0||n==1)
		{
			return a;
		}
		else
		{
			return fun1(n-1,a*n);
		}
	}
int main()
{
	int n=15;
	int a=fun(n);
	int b=fun1(n,1);
	printf("%d-----%d",a,b);
	return 0;
}

区别就是尾递归可以减少内存使用,因为递归是非常消耗内存的,其间要保存的大量的temp值,而且尾递归的效率高于递归

而递归比较适合层次很深的函数。两者各有好处!但是我们还是尽量使用尾递归,两者还有参数上个数的区别

尾递归始终用的是同一个内存区域,入口参数和出口返回值不断更新,但是大大减少了内存

而递归是不能更新的,记住这点就行,递归要想成功就得不断保存每一次调用而出现的值,因此内存耗用是非常大的

#include <stdio.h>
#include <stdlib.h>

int eat1(int n,int a)//a为桃子数,n为一共的天数,
{
	if(n==1)
	{
		return a;
	}
	else
	{
		return eat1(n-1,2*(a+1));
	}
}
int eat(int n)
{
	if(n==1)
	{
		return 1;
	}
	else if(n>1)
	{
		return 2*(eat(n-1)+1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	printf("%d\n",eat1(10,1));//算猴子吃了十天后只剩一个苹果,这个猴子吃的苹果的总数
	printf("%d",eat(10));
	return 0;
}


你可能感兴趣的:(尾递归和递归)