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


相关文章
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
818 16
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
755 8
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
904 5
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
553 4
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
1043 7
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
2464 12
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。