C语言中的函数递归
什么是递归
程序调用自生的编程技巧称作递归。所谓递归就必然存在着递出与回归,递归的全过程其实是将一个问题分成若干个解法相同的问题,将初始的数据一直往后传送,当到达一个临届值后开始回归,从原路返回实现问题的解决。
递归策略使得只需要少量的程序就可以描述出解题中多次重复的计算,大大减少了代码的长度。
递归的精髓就在于大事化小。
递归必须注意的事
1存在限制条件,当满足这个条件时,递归便不在继续,(也就是说要有一个临界值)
2每次递归后都会接近临界值,且递归层次不要太深。
递归练习题
1接受一个整型(无符号),按顺序打印每一位
eg:输入1234,打印1 2 3 4;
首先读题其实就是将不同位拆开,且先将1打出来。那么当这个数只剩最高位也就是临界值, 所以a(输入的数)/10==0;也就是临界值的判断。然后每回打印a%10就行了
#include <stdio.h>
int print(unsigned int n)
{
if (n > 9)
{
print(n/10);
}
n = n % 10;
printf("%d ", n);
return 0;
}
int main()
{
unsigned int a = 0;
scanf("%u", &a);
print(a);
return 0;
}
2用递归求n的k次方
#include <stdio.h>
int index(int n, int k)
{
int i = 1;
if (i < k)
{
return n * index(n, k - 1);
}
else
{
return n;
}
}
int main()
{
int n = 2;
int k = 5;
int num= index(n, k);
printf("%d", num);
return 0;
}
这个比较简单就不做图解了;
3编写函数不用许创建临时变量,求字符长度
引入一个知识点,当你函数调用传送的是一个数组时,数组名其实传递的是数组首元素的地址。还有就是当使用char arr[] = “bit”;这种方式创建数组时其实字符串是“bit\0”
#include <string.h>
#include <stdio.h>
int my_strlen1(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;//字符指针+1,向后跳1个字符
}
return count;
}
int my_strlen2(char* str)
{
if (*str != '\0')
return 1 + my_strlen2(str + 1);
else
return 0;
}
int main()
{
char arr[] = "bit";
int len1 = my_strlen1(arr);
//数组名其实传递的是数组首元素的地址
printf("%d\n", len1);
int len2 = my_strlen2(arr);
printf("%d\n", len2);
return 0;
}
比如我们输入一个字符串bit,
青蛙跳台阶
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?很经典的一道题
题解://小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
//从题可知小乐乐在n台阶时他到这一台阶要不1从n-1上来,要不2从n-2阶上来
//假设到n节有f(n)方式,n-1节有f(n-1)方式,n-2节有f(n-2)方式
//易得f(n)=f(n-1)+f(n-2)
#include <stdio.h>
int way(num)
{
if (num == 1)
return 1;
if (num == 2)
return 2;
else {
return way(num - 1) + way(num - 2);
}
}
int main()
{
int num;
scanf("%d", &num);
printf("%d", way(num));
return 0;
}
递归缺点
1递归会导致函数的多次调用,而每次函数调用过程中都会在程序的调用栈(call stack)所开辟空间,但是栈区的空间是有限的当递归的层次太深时就会出现栈溢出(strack overflow).
2递归可能会导致函数的计算可能会变多如斐波那契数列的计算,也就是不够快
。