函数递归
什么是递归?
程序调用自身的编程技巧成为递归,递归为一种算法在程序设计中广泛应用,一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规格较小的问题来解决,递归值需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量,递归的主要思考方式在于:把大事化小。
递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不在继续。
- 每次递归调用之后越来越接近这个限制条件。
递归常见的错误:栈溢出(在多次递归后,程序溢出)
函数的调用是向内存申请空间。
栈溢出:stack overflow:栈空间被站满
程序员的知乎
利用TDD - 测试驱动开发的思路写代码。
TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。
练习1:(画图讲解)
接受一个整型值(无符号),按照顺序打印它的每一位,例如:输入:1234,输出1 2 3 4
#include<stdio.h>
void print(int n)
{
if (n > 9) //n>9说明数字至少是两位以上
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0; //unsigned 是无符号类型
scanf_s("%d", &num);
print(num);
//pinrt(1234)
//print(123)4
//print(12)3 4
//print(1) 2 3 4
return 0;
}
练习2:
编写函数不允许创建临时变量,求字符串的长度。
分析:不允许使用#include<string.h> strlen 求字符串长度的关键字,
要自己定义个函数用递归的方式来求字符串长度。
不允许创建临时变量的意思是,不允许创建全局变量和局部变量。
常用的递归的方式
#include<stdio.h>
int my_strlen(char* str)//取arr数组的第一个下标地址
{
//计算字符串的长度
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
//int len = strlen(arr);//求字符串长度
//printf("%d\n", len);
//模拟实现了一个strlen函数
int len = my_strlen(arr); //arr是数组,数组传参,传过去的不是整个数组,二十第一个元素的地址。
printf("len = %d\n", len);
return 0;
}
正确书写
#include<stdio.h>
int my_strlen(char* str)//取arr数组的第一个下标地址
{
//计算字符串的长度
//把大事化小
//my_strlen("bit")
//1+my_strlen("it")
//1+1+my_strlen("t")
//1+1+1+0
//3
if (*str != '\0')
{
return 1 +my_strlen(str + 1);
}
else
{
return 0;
}
//递归中函数的执行要从上往下执行,执行完成时,才会返回一个值.
}
int main()
{
char arr[] = "bit";
//int len = strlen