C语言之递归编程练习题

简介: C语言之递归编程练习题

1.


作业标题(682)


递归实现n的k次方


作业内容


编写一个函数实现n的k次方,使用递归实现。


参考代码为:


//编写一个函数实现n的k次方,使用递归实现
#include <stdio.h>
int hanshu(int n, int k)
{
  int i = 0;
  if (k <= 0)
  return 1;
  if (k >= 1)
  return n * hanshu(n,k - 1);
}
int main()
{
  int n = 0;
  int k = 0;
  scanf_s("%d %d", &n, &k);
  printf("%d\n", hanshu(n,k));
  return 0;
}


运行的结果为:


0a2653c851af460fa595bd959398a8f1.png


2.


作业标题(683)


计算一个数的每位之和(递归实现)


作业内容


写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和


例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19


输入:1729,输出:19


参考代码为:


//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和.
//例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include <stdio.h>
int DigitSum(int n)
{
  int sum = 0;
  int m = 0;
  if (n != 0)
  {
  m = n % 10;
  n = n / 10;
  sum = m + DigitSum(n);
  }
  return sum;
}
int main()
{
  int a;
  printf("请输入一个整数: ");
  scanf_s("%d", &a);
  printf("各位数之和为:%d\n", DigitSum(a));
  return 0;
}


代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


3.


作业标题(684)


字符串逆序(递归实现)


作业内容


编写一个函数 reverse_string(char * string)(递归实现)


实现:将参数字符串中的字符反向排列,不是逆序打印。


要求:不能使用C函数库中的字符串操作函数。


比如:


char arr[] = "abcdef";

逆序之后数组的内容变成:fedcba


参考代码为:


#include<stdio.h>
void  reverse_string(char* string)
{
  if (*string != '\0')
  {   
  string++; 
  reverse_string(string);
  printf("%c", *(string - 1)); 
  }
}
int main()
{
  char string[] = "abcdef";
  reverse_string(string);
  printf("\n");
  return 0;
}


代码的运行结果为:

12c3b7f3f8814309a195c64f051d4445.png


4.


作业标题(685)


strlen的模拟(递归实现)


作业内容


递归和非递归分别实现strlen


参考代码为:


//递归和非递归分别实现strlen
//递归
#include <stdio.h>
#include <string.h>
int my_strlen(char* str)
{
  if (*str != 0)
  return 1 + my_strlen(str + 1);
  else
  return 0;
}
int main()
{
  char arr[] = "abcdef";
  int len = my_strlen(arr);//char*
  printf("%d\n", len);
  return 0;
}
//非递归
#include <stdio.h>
#include <string.h>
int my_strlen(char* str)
{
  int count = 0;  //临时变量
  while (*str != '\0')
  {
  count++;
  str++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  int len = my_strlen(arr);//char*
  printf("%d\n", len);
  return 0;
}


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


5.


作业标题(681)


计算斐波那契数


作业内容


递归和非递归分别实现求第n个斐波那契数


例如:


输入:5  输出:5


输入:10, 输出:55


输入:2, 输出:1


参考代码为:


递归方法:

//递归和非递归分别实现求第n个斐波那契数
//求第n个斐波那契数(递归)
#include <stdio.h>
int fib(int i)
{
  if (i <= 2)
  return 1;
  if (i > 2)
  return fib(i - 1) + fib(i - 2);
}
int main()
{
  int i = 0;
  scanf_s("%d", &i);
  printf("%d\n", fib(i));
  return 0;
}


非递归方法为:


//求第n个斐波那契数(非递归)
#include <stdio.h>
int fib(int n)
{
  int a = 1;
  int b = 1;
  int c = 1;
  while (n > 2)
  {
  c = a + b;
  a = b;
  b = c;
  n--;
  }
  return c;
}
int main()
{
  int i = 0;
  scanf_s("%d", &i);
  printf("%d\n", fib(i));
  return 0;
}


代码的运行结果为:

34e8d716411043c08c7ffba9fbba23de.png


相关文章
|
1月前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
1月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
1月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
1月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
1月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
1月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
1月前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
1月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
2月前
|
传感器 数据采集 API
C语言与硬件编程:GPIO操作
C语言与硬件编程:GPIO操作
62 0
|
2月前
|
Linux 开发工具 C语言
C语言与图形编程进阶
C语言与图形编程进阶
20 0