函数递归(总结)

什么是递归?

程序调用自身的编程技巧称为递归。

递归的主要思考方式在于:把大事化小

递归的两个必要条件:

(1)跳出条件:存在限制条件,当满足这个限制条件时,递归便不再继续

(2)限制条件:每次递归调用之后越来越接近这个限制条件。

来看几组练习,看看递归是如何实现的?

----->1.

//接受一个整形值(无符号),把它转换成字符并打印它
//输入1234 输出 1 2 3 4 
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d",n%10);
}

int main()
{
	int num = 1234;
	print(num);
	system("pause");
	return 0;
}

递归调用方式:



屏幕就会输出 1 2 3 4 

------>2.

题目:编写函数不允许创建临时变量,求字符串长度:

方法实现:采用(递归)的方式

int my_strlen(char *str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(str + 1);//str指向a str+1指向b
	}
}
int main()
{
	char *p = "abcdef";
	int len = my_strlen(p);
	printf("%d\n",len);
	system("pause");
	return 0;
}

那么,上面这道题,你可以采用非递归实现吗?(计数器方式)

int my_strlen(char *str)
{
	assert(str != NULL);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char *p = "abcdef";
	int len = my_strlen(p);
	printf("%d\n", len);
	system("pause");
	return 0;
}

------>3.

题目:求n的阶乘

方法一:使用循环的方法实现

int Fac(int n)
{
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int num = 0;
	int ret = 0;
	scanf("%d",&num);
    ret = Fac(num);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

方法二:使用递归的方法实现

int Fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * Fac(n - 1);
}
int main()
{
	int num = 0;
	int ret = 0;
	scanf("%d",&num);
        ret = Fac(num);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

-------->3.

题目:求第n个斐波那契数列

方法一:递归

int Fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
		return Fib(n - 1) + Fib(n-2);
}
int main()
{
	int num = 0;
	int ret = 0;
	scanf("%d",&num);
    ret = Fib(num);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

方法二:循环

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int num = 0;
	int ret = 0;
	scanf("%d",&num);
    ret = Fib(num);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
类似递归的问题还有许多,例如,汉诺塔问题,青蛙爬楼梯问题,多做多理解,加油!


递归比非递归的形式更为清晰,但是大多数问题迭代实现比递归实现效率更高,虽然代码可读性差。多用多体会!





猜你喜欢

转载自blog.csdn.net/weixin_40123831/article/details/80263327