C语言函数递归练习

简介: 目录1. 接受一个整型值(无符号),按照顺序打印它的每一位。2. 编写函数不允许创建临时变量,求字符串的长度。3. 求n的阶乘。(不考虑溢出)4. 求第n个斐波那契数。(不考虑溢出)

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;
}

image.png让我们对上述代码进行画图分析吧:

image.png

2. 编写函数不允许创建临时变量,求字符串的长度。

再使用递归方法完成此题目之前,我们先看看两个非递归的方法:

法一:库函数strlen法:

#include<stdio.h>
int main()
{
  //求字符串长度
  char arr[] = "abc";
  int len = strlen(arr);
  printf("%d\n", len);
  return 0;
}

image.png 法二:使用自定义函数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;
}

同样的,我们也通过画图分析下:

image.png法四:指针减去指针

#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;
}

image.png

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;
}

image.png法二(递归)

#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;
}

image.png

相关文章
|
2天前
|
机器学习/深度学习 C语言
详细解读C语言math.h中常用函数
详细解读C语言math.h中常用函数
|
20小时前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
5 0
|
23小时前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
4 0
|
23小时前
|
程序员 C语言
C语言内存管理:malloc、calloc、realloc与free函数详解
C语言内存管理:malloc、calloc、realloc与free函数详解
2 0
|
1天前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
6 0
|
1天前
|
存储 C语言
C语言中的变量与函数详解
C语言中的变量与函数详解
3 0
|
1天前
|
存储 C语言
C语言中的printf函数详解
C语言中的printf函数详解
8 0
|
3天前
|
C语言
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
|
2天前
|
C语言
C语言prinf函数
C语言prinf函数
10 4
|
2天前
|
编译器 程序员 Serverless
函数(C语言)
函数(C语言)