C语言好题解析(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: C语言好题解析(二)

递归类型

例题1

根据下面递归函数:调用函数Fun(2),返回值是多少(       )
int Fun(int n)
{
  if (n == 5)
    return 2;
  else
    return 2 * Fun(n + 1);
}
A.2 B.4 C.8 D.16

【答案】 D

【分析】

1:递归解题思路就是要注意递归的限制条件,满足限制条件时递归就不再继续,且每次递归调用之后都会接近这个限制条件

2:由题目我们可以知道限制条件为n==5,当我们输入比5小的数时,n是以每次增加1的趋势接近限制条件

流程如下(第一次用画图软件,画的不是很好看)

例题2

通过用递归的方式实现求第n个斐波那契数
例如
输入:5  输出:5
输入:10, 输出:55
输入:2, 输出:1

【分析】

1:斐波那契数定义为:jack(0)=0,jack(1)=1,jack(n)=jack(n-1)+jack(n-2)(n>=2),总之就是第n个数为n的前两个数相加的和

2:我们根据斐波那契数的定义知jack(1)=1,jack(2)=1,因为jack(0)=0所以不管,因此我们设定条件n=1和n=2时返回1(限制条件),而当n>=2是返回jack(n-1)+jack(n-2)实现递归(趋近于限制条件)

【代码】

int jack(int n)
{
  if (1 == n || 2 == n)
  {
    return 1;
  }
  else
  {
    return jack(n - 1) + jack(n - 2);
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  printf("%d", jack(n));
  return 0;
}

例题3

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

【分析】

1:根据递归我们需要限制条件,因为n在输入之后就无法改变,因此我们需要对k进行设置,即0==k时我们返回1

2:当k大于0时我们为了让其趋近于限制条件,因此k每次递推后就需要减1

【代码】

int jack(int n, int k)
{
  int sum = 0;
  if (0 == k)
  {
    sum = 1;
    return sum;
  }
  else if (k > 0)
  {
    k = k--;
    sum = n * jack(n, k);
    return sum;
  }
  else
    return 0;
}
int main()
{
  int n, k;
  scanf("%d %d", &n, &k);
  printf("%d ",jack(n, k));
  return 0;
}

例题4

写一个递归函数DigitSum(n),输入一个非负整数
返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9
它的和是19
输入:1729,输出:19

【分析】

1:在看到返回值为个位 十位 百位…数字时,我们一般都会用到求余(%),这样就可以将每位数单独提出来

2:因为是要用到递归,因此我们需要限制条件,即当n<10时直接返回n(个位数),而要有使递推趋近限制条件就需要用/号,这样就会把最后一位数消去

【代码】

int jack(int n)
{
  if (n < 10)
    return n;
  else
  {
    int sum = n % 10 + jack(n / 10);
    return sum;
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  printf("%d", jack(n));
  return 0;
}

例题5

递归实现求n的阶乘(不考虑溢出的问题)

【分析】

我们以n==1返回1作为限制条件,然后每次n减1

【代码】

int jack(int n)
{
  int sum = 0;
  if (n > 1)
  {
    sum = n * jack(n - 1);
    return sum;
  }
  if (1 == n)
  {
    sum = 1;
    return sum;
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  printf("%d", jack(n));
  return 0;
}

我们对前面的代码进行一些优化如下

【代码】

int jack(int n)
{
if(n==1)
return 1;
return n*jack(n-1);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  printf("%d", jack(n));
  return 0;
}

例题6

递归方式实现打印一个整数的每一位

【分析】

这道题和例题4几乎一样,所以就不进行分析了

【代码】

void jack(int n)
{
  if (n >= 0)
  {
    if (n <= 9)
    {
      printf("%d ", n);
    }
    else
    {
      int sum = 0;
      sum= n % 10;
      jack(n / 10);
      printf("%d " ,sum);
    }
  }
}
int main() 
{
  int n = 0;
  scanf("%d", &n);
  jack(n);
  return 0;
}
目录
相关文章
|
1月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
153 14
|
1月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
556 6
|
1月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
44 5
|
1月前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
48 5
|
2天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
26 15
|
2天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
39 24
|
2天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
39 23
|
1天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
15 1
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
75 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
59 9

推荐镜像

更多