函数递归和练习

(一)嵌套调用和链式访问

1.函数是不可以嵌套定义的,但是可以嵌套调用。

2.链式访问:就是将一个函数的返回值作为另一个函数的参数。如下:

#include<stdio.h>
int main()
{
  int t = strlen("abc");//使用strlen函数算出字符串的长度将其赋值给t
  printf("%d\n",t);
  printf("%d\n,strlen("abc")); //此时strlen函数的返回值为3,也就是printf函数的参数
  return 0;
}

思考:printf(“%d”,printf(“%d”,printf(“%d”,43)));会打印出什么呢?

那么为什么会打印出4321呢?

原因是printf函数的返回值是打印在屏幕上的字符的个数。所以上述代码所描述的意思就是,首先最里面的printf函数打印出43,两个字符所以返回值为2;第二个printf函数就会打印出2,一个字符,所以返回值为1;最外层的printf函数就会打印1。

(二)函数递归

1.含义:指一个函数在其定义的时候直接或间接调用自身的方法。

2.思考策略:“大事化小”

举一个例子(在程序中基本不用,是错误的,但可以很好的说明递归)代码如下:

int main()
{	
	printf("%d\n",123456789);
	main(); //这就是在自己的函数中调用自己
	return 0;
}

上述代码的运行结果就是一直打印123456789。

练习一:输入无符号1234,依次打印1,2,3,4

步骤一:先使用大事化小的思路来分析如何使用函数递归。如下图

也就是1234,第一次调用后剩余123,第二次调用后剩余12,在调用最后剩1并且跳出调用。

步骤二:编写执行体函数

   1.要实现1234变为123再变为12最后成1,容易想到需要使用 1234/10 和 1234%10 来实现。

代码如下:

#include<windows.h>  //此处使用Sleep函数需要引用改头文件
void print(unsigned int n)
{
	if (n > 9)   //当这个数是两位数的时候才进入一下语句
	{
		print(n / 10);  //递归
	}
	printf("%d", n % 10);  //只剩1的时候打印出来
	Sleep(1000);   //使用该函数方便看清楚是如何依次打印出来的
}

int main()
{	
	int n = 1234;
	int m = 0;
    print(n);

}

相信这样直接写出代码是很难理解的,所以请看下图

根据上图可知,递归可以分为两个阶段:递和归

第一个阶段:逐层调用print函数。当n=1234进入print函数之后会再一次以n=123进入一次print函数,之后又以n=12进入一次print函数,最后n=1进入一次print函数。

第二个阶段:逐层跳出if语句,执行后面的语句。也就是n=1时不满足if语句所以不再进入print函数,直接执行1%10打印出1;再到n=12,调用print函数之后打印出1后执行12%10打印出2;同理依次往上打印出3;再打印出4。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值