看到一句很幽默的话---“没有调不好的代码,只有不够秃的头。”
(不能秃头^~^!)
7).函数的递归
1.什么是递归
·程序调用自身的编程技巧称为递归(recursion)。
·递归作为一种该算法在程序设计语言中广泛应用。
·一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
·它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
·递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小。
·举一个例子:
接受一个整型值(无符号),按照顺序打印每一位。
例如:输入:1234,输出:1 2 3 4 (把1234真实的拆成每一位打印在屏幕上)
(PS:%d 是打印有符号的整数<会有正负数> %u 是打印无符号的整数)
分析如何递归
递归路线(即函数自己调用自己)
2.递归的两个必要条件
·存在限制条件,当满足这个限制条件的时候,递归便不再继续。
·每次递归调用之后越来越接近这个限制条件。
练习题
·编写函数不允许创建临时变量,求字符串的长度
(PS:strlen 可以求字符串长度<不包括\0>)
·首先写一个创建临时变量的方法(临时变量为 count)
#include <stdio.h>
//编写函数不允许创建临时变量,求字符串的长度
//就是模拟实现strlen
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;//找下一个字符
}
return count;
}
int main()
{
char arr[] = "abc";//a b c \0
int len = my_strlen(arr);//传的是首字符的地址
printf("%d\n", len);
return 0;
}
·不创建临时变量
递归求解:
my_strlen("abc")--->
1+my_strlen("bc")--->
1+1+my_strlen("c")--->
1+1+1+my_strlen("\0")--->
1+1+1+0
#include <stdio.h>
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str+1);
else
return 0;
}
int main()
{
char arr[] = "abc";//a b c \0
int len = my_strlen(arr);//传的是首字符的地址
printf("%d\n", len);
return 0;
}