C语言第10讲(函数递归)

函数递归

函数递归:函数自己调用自己

问题:下方代码运行后会产生什么结果?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

int main()
{
	printf("HAHA\n");
	main();
	return 0;
}

运行效果:死循环一段时间后,程序显示 stack over (栈溢出)

                stack over的原因是 :每次函数调用,都会占一块内存空间。如果函数不返回,则函数开辟的空间一直占用,直到函数返回,才逐渐释放空间(开辟的空间,叫做"栈帧空间")。而一直不返回,直到开辟的空间占满栈区,产生的结果为 stack over

递归的思想

                把一个大型的复杂的问题层层转化为一个与原问题相似,但规模较小的子问题来求解:直到子问题不能再被拆分,递归结束。(大化小)

书写递归的必要条件

        • 递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。

                类似:循环语句的  判断

        • 每次递归调⽤之后越来越接近这个限制条件。

                类似:循环语句的  调整

问题:求n的阶乘 

           n!= n * (n-1)!

信息:阶乘的分段函数

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

int fun1(int n)
{
	//实现正整数的阶乘
	if (n == 0)
		return 1;
	else if (n > 0)
		return n * fun1(n - 1);

	//规避负整数
	else
		return -1;
}

int main()
{
	int n = 0;
	scanf("%d",&n);
	int ret1 = fun1(n);
	printf("%d", ret1);
	return 0;
}

问题:顺序打印一个整数的每一位 (使用递归)

                输入:1234

                输出: 1 2 3 4

思考线路:

        1234(n)%10 = 4 我们可以获得 位的数值。

        回到题目,我们需要的是 所有位的数组

        所以我们可以借用 1234/10去 调整 n数的个位,而依次获得所有位的值

        停止条件,为n<10

        综上列出依次获得数 : 4 3 2 1

        联系递归的顺序  

获得上图效果代码

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void fun(int n)
{
    if (n < 10);
    else
        fun(n / 10);
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    fun(n);
    return 0;
}

由上图我们可以详细的知道:

        调用获得顺序为:4 3 2 1

        回归获得顺序为:1 2 3 4 

        得出调用顺序和回归顺序相反

由题目我们需要的顺序为 1 2 3 4

我们在函数调用语句的下方添加 printf

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void fun(int n)
{   
	//打印 4 3 2 1
	printf("%d ", n % 10);
	if (n < 10)
		//打印完 4 3 2 1 后换行
		printf("\n");
	else
		fun(n / 10);
	//打印 1 2 3 4
	printf("%d ", n % 10);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	fun(n);
	return 0;
}

归纳:

          代码

void fun(int n)
{
	if (n < 9)
		print(n / 10);
	printf("%d ", n % 10);
}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值