递归:程序调用自身编程技巧称为递归。
最简单的递归:
#include <stdio.h>
int main()
{
printf("hehe\n");
main();
return 0;
}
递归的常见错误:栈溢出 Stack Overflow
栈区:局部变量,函数参数
堆区:动态开辟的内存,malloc,calloc
静态区:全局变量,static修饰的变量
递归的两个必要条件:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
接受一个整形值(无符号),按照顺序打印它的每一位,例如:输入1234 输出1 2 3 4
#include <stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10); //print(1234)
} //print(123)4
int main() //print(12)34
{ //print(1)234
unsigned int num = 0;
scanf_s("%d", &num);
print(num);
return 0;
}
编写函数,不允许创建临时变量,求字符串的长度。
#include<stdio.h>
#include<string>
int main()
{
char arr[] = "bit";
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
arr是数组,数组传参传过去的不是整个数组,而是第一个元素的地址。
#include<stdio.h>
int q(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
int len = q(arr);
printf("len=%d\n", len);
return 0;
}
递归方法:
#include<stdio.h>
int q(char* str)
{
if (*str != '\0')
return 1 + q(str + 1);
else
return 0;
}
int main()
{
char arr[] = "bit";
int len = q(arr);
printf("len= %d\n", len);
return 0;
}
递归与选代
求n的阶乘(不考虑溢出)
#include<stdio.h>
int q(int n)
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d", &n);
ret = q(n);
printf("%d\n", ret);
return 0;
}
#include<stdio.h>
int q(int n)
{
if (n <= 1)
return 1;
else
return n * q(n - 1);
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d", &n);
ret =q(n);
printf("ret=%d\n", ret);
return 0;
}
斐波那契数列
1 1 2 3 5 8 13 21 .......
#include<stdio.h>
int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d\n", &n);
ret = fib(n);
printf("ret= %d\n", ret);
return 0;
}
简洁递归方法:
#include<stdio.h>
int q(int n)
{
int a = 1;
int b = 1;
int c = 0;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d", &n);
ret =q(n);
printf("ret=%d\n", ret);
return 0;
}