目录
1. 接受一个整型值(无符号),按照顺序打印它的每一位。
例如数字1234
//1234
//1 2 3 4
//借助于print(1234)函数
//print(123)4
//print(12) 3 4
//print(1) 2 3 4
再完成代码之前,我们先理以下思路。
假设输出1234,想按顺序打印1 2 3 4 .我们可以创建一个if判断语句,若我们输出的值大于9,那我们用这个数字%10,1234%10=4;随后再用1234/10=123;将123%10=3;再用123/10=12;将12%10=2,再用12/10=1;此时跳出判断,利用递归将其按顺序打印。
#include<stdio.h>
void print(unsigned int n) //n=1234
{
if (n > 9)
{
print(n / 10); //print(123) 1 2 3
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%d", &num);//1234
print(num);
return 0;
}
让我们对上述代码进行画图分析吧:
2. 编写函数不允许创建临时变量,求字符串的长度。
再使用递归方法完成此题目之前,我们先看看两个非递归的方法:
法一:库函数strlen法:
#include<stdio.h>
int main()
{
//求字符串长度
char arr[] = "abc";
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
法二:使用自定义函数my_strlen模拟库函数strlen的作用
#include<stdio.h>
int my_strlen(char* s )
{
int count = 0;
//printf("%c\n", *s); 打印出a
while (*s != '\0')
{
count++;
s++;
}
return count;
}
int main()
{
//求字符串长度
char arr[] = "abc";
//arr是数组名,数组名是数组首元素的地址
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
法三:不创建临时变量,求字符串长度(递归)
#include<stdio.h>
int my_strlen(char* s)
{
if (*s == '\0')
return 0;
else
return 1 + my_strlen(s + 1);
}
int main()
{
//求字符串长度
char arr[] = "abc";
//arr是数组名,数组名是数组首元素的地址
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
同样的,我们也通过画图分析下:
法四:指针减去指针
#include<stdio.h>
#include<string.h>
int my_strlen(char* s)
{
char* start = s;
while (*s != '\0')
{
s++;
}
return s - start;
}
int main()
{
char arr[] = "abc";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
3. 求n的阶乘。(不考虑溢出)
法一(循环):
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
//循环产生1到n-1的数字
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
法二(递归)
#include<stdio.h>
int fac(int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac(n);
printf("%d\n", ret);
}
4. 求第n个斐波那契数。(不考虑溢出)
斐波那契:
1 1 2 3 5 8 13 21 34 55
第三个数字等于前面两个数字和,最前面两个数字都是1
法一 (递归)(此方法不太合适,效率太低)
#include<stdio.h>
int count = 0;
int fib(int n)
{
if (n == 3)
count++;
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
printf("%d\n", count);
return 0;
}