什么是递归?
· 递归,就是在运行的过程中不断地调用自己,程序调用自身的编程技巧称为递归。
· 递归主要在于递推与回归。
· 递归好处:代码更简洁清晰,可读性更好 。
· 递归的主要思考方式在于:大事化小。
递归的两个必要条件
· 递归一定存在限制条件,当满足这个限制条件时,递归便不再继续
· 每次递归调用后都会越来越接近这个限制条件
如果缺少这两个必要条件,会导致递归不断深入,不断向内存申请空间,最终内存空间不足导致程序的崩溃。所以我们在写递归代码时一定要注意这两点!
递归实例
接下来我们用几个例子来帮助我们学习递归的使用
1、接受一个整型值,按顺序打印它的每一位
(例如:输入1234 打印 1 2 3 4
首先,编写一个代码输入一个整型值:
#include<stdio.h>
int main()
{
int num;
scanf("%d", &num); //输入1234 使num=1234
return 0;
}
然后我们需要明白这个例子的递归原理:
我们使用一个print()函数来实现以上内容:
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
由此,我们就成功实现了将1234的逐位打印:
#include<stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num;
scanf("%d", &num); //输入1234 使num=1234
print(num);
return 0;
}
2、编写函数不允许创建临时变量,求字符串的长度
原理很简单,我们只需计算出'\0'前的每一位即可,与strlen函数同理,我们构建一个自己的my_syrlen函数。
首先给出主函数:
#include<stdio.h>
int main()
{
char arr[] = "abc";
int len = my_strlen(arr); //用来接受函数返回的字符串长度
printf("%d\n", len);
return 0;
}
要求字符串长度,我们可以从头开始一位一位往后判断是不是'\0',如果不是,返回值的长度+1,如果是,则证明这个字符串的长度就到这里了,返回值的长度为0。
int my_strlen(char* arr)
{
if (*arr == '\0')
return 0;
else
return 1 + my_strlen(arr + 1);
}
由此,我们成功实现了求字符串的长度:
#include<stdio.h>
int my_strlen(char* arr)
{
if (*arr == '\0')
return 0;
else
return 1 + my_strlen(arr + 1);
}
int main()
{
char arr[] = "abc";
int len = my_strlen(arr); //用来接受函数返回的字符串长度
printf("%d\n", len);
return 0;
}
使用递归的注意事项
我们使用递归时,递归调用的层次不能太过深。系统分配给程序的栈空间是有限的,但是如果出现了死循环(或者死递归),这样有可能导致一直开辟空间,最终产生栈空间耗尽的情况,这种现象我们称为栈溢出。
许多问题用递归实现只是因为他比非递归的形式更为清晰。当一个问题相当复杂,难以用递归实现时,我们不要强求,我们可以使用迭代来实现,虽然代码的可读性会稍微差一些。
以上就是 C语言基础:函数递归(内含详细图解)的全部内容了,希望对你有所帮助!