C语言-函数的递归和迭代

以下是我初学C语言的笔记记录,欢迎在评论区补充留言

 一,函数的递归

大致有这么几个问题【我看完这堂课后,自己总结的几个问题】

* 问题

1,什么是函数的递归, 2,它是干什么用的,3,有什么条件吗,4,它与循环又有什么区别

* 回答

1,2:

是一个将重复性的问题,或是一个大的问题,给它精进成较小的问题,用较少的代码去解决;核心就是大事化小,有点像倒过来的金字塔,不断向下深究,从大到小慢慢解决

3:

有两个必要条件:第一,存在一个限定条件,当满足这个限定条件后,不再进行递归;第二,每次递归后越来越接近这个限定条件;

必须在编写函数的递归时候,要有这两个条件,有这两个递归条件不能保证不会死递归,但是没有他两,一定会死递归

4:

递归,你一再又再地跌入深谷【递】,直到跌到谷底【必要的条件】,你开始慢慢的向上攀爬回来【归】;循环,像是汽车在环形车道里绕圈,直到看到出口才会出去;前者是不断地往下递,在达到一个条件后,慢慢的归,后者是重复一个动作,直到满足一个条件后才停止这个动作

//函数的递归
//在不使用临时变量,计算字符串的大小
#include<stdio.h>

int my_strlen(char* str)
{
	if (*str != '\0') //必要的条件
	{
		return 1 + my_strlen(str + 1); 
        //用到了函数的递归
	}
	else
		return 0;
}
int main()
{
	char str[] = "abcd";
	printf("%d", my_strlen(str)); //计算出str的大小
	return 0;
}

思路:

首先,main函数中,调用了函数my_strlen(),并且传入实参 str 给到形参,由于数组传参是传递首个字符的地址,所以形参是一个指针变量

其次,根据,在my _strlen()函数中,根据形参给的地址,进行一个解引用操作,来进行判断是否为 '\0'(字符串的结束标志)的条件

困惑:为什么要用到 return 1 + my_strlen(str +1);

原因:由于第一个元素是a,所以字符串的大小至少是从 1 开始的,接着再用 str + 1,将现在的指针变量转向 b 的地址,再次进入这个函数,以此类推,到 \0 时候,发现 if 的条件不满足,进入到 else 中,返回 0 ,自此,“递”的动作做完,开始“归”,将刚刚没有执行完的返回值语句,一个个执行

二,函数的迭代

迭代包含循环,循环是一种特殊的迭代

【琐碎记录】

* %d 是打印有符号的整数,有正负数

* %u对应无符号,无负号

*  内存三个部分,栈区,堆区,静态区

* 函数的形参,局部变量,函数的调用都在栈区

* 死递归,栈溢出 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值