《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-7(question?)

【例10-7】用递归方法编写一个程序,返回整型数组array中的最大值。数组array中的元素互不相等。

       【分析】

        要得到一个数组中的最大值最常见的方法是通过一个循环操作遍历数组中的元素,从而筛选出最大的元素。但是应用递归的方法也是一种很好的选择,因为寻找最大元素的过程本身具有递归特性。可以这样描述在一个数组中寻找最大元素的过程:

        (1)如果该数组中只有一个元素,那么该元素就是最大的值,因此将其返回。

         (2)如果该数组中的元素个数大于1,那么将该数组中的第一个元素与后面其他元素中最大值进行比较。如果第一个元素大于后面其他元素中的最大值,则返回第一个元素,否则返回后面其他元素中的最大值。

          那么计算“后面其他元素中的最大值”的过程又是重复执行(1)、(2)的过程,因此可以递归调用这个过程。其算法描述如下:

     int arrayMaxVal(int array[],int n)
{
  if(n == 1) return array[0];
   if (array[0]>=arrayMaxVal(array+1,n-1))
        return array[0];
   else
         return  arrayMaxVal(array+1,n-1);
}

        函数arrayMaxVal()的作用是返回数组arraya中的最大值,参数n标志着数组arraya中元素的个数。首先判断n是否等于1,如果n等于1表示当前数组中只有1个元素,因此返回array[0];否则比较array[0]arrayMaxVal(array+1,n-1)的大小,并返回其中较大的值。arrayMaxVal(array+1,n-1)是递归调用函数arrayMaxVal()的过程,它返回当前数组中除第一个元素外,后面其他元素中的最大值。

        下面给出完整的测试程序,程序清单10-7

#include <stdio.h>

int arrayMaxVal(int array[],int n)
{
  if(n == 1) return array[0];
   if (array[0]>=arrayMaxVal(array+1,n-1))
        return array[0];
   else
         return  arrayMaxVal(array+1,n-1);
}

main()
{
    int array[]={1,2,13,11,7,9,3},max;
    max = arrayMaxVal(array,7);
    printf("The max elem in the array is %d\n",max);
    getche();
}


     本程序运行结果如下图所示

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
妙趣横生算法(C语言实现)》可作为算法入门人员的教程,也可以作为学习过C语言程序设计的人士继续深造的理想读物,也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考资料,同时也为那些准备参加与算法数据结构相关的面试的读者提供一些有益的帮助。最大的特色在于实例丰富,材新颖有趣,实用性强,理论寓于实践之中。理论与实践相结合,旨在帮助读者理解算法,并提高C语言编程能力,培养读者的编程兴趣,并巩固已有的C语言知识。全书分为2个部分共10,内容涵盖了编程必备的基础知识(如数据结构、常用算法等),编程实例介绍,常见算法数据结构面试等。可以使读者开阔眼界,提高编程的兴趣,提高读者的编程能力和应试能力。 目录: 第1部分 基础篇 第1 数据结构基础 1.1 什么是数据结构 1.2 顺序表 1.2.1 顺序表的定义 1.2.2 向顺序表中插入元素 1.2.3 从顺序表中删除元素 1.2.4 实例与分析 1.3 链表 1.3.1 创建一个链表 1.3.2 向链表中插入结点 1.3.3 从链表中删除结点 1.3.4 销毁一个链表 1.3.5 实例与分析 1.4 栈 1.4.1 栈的定义 1.4.2 创建一个栈 1.4.3 入栈操作 1.4.4 出栈操作 1.4.5 栈的其他操作 1.4.实例与分析 1.5 队列 1.5.1 队列的定义 1.5.2 创建一个队列 1.5.3 入队列操作 1.5.4 出队列操作 1.5.5 销毁一个队列 1.5.6 循环队列的概念 1.5.7 循环队列的实现 1.5.8 实例与分析 1.6 树结构 1.6.1 树的概念 1.6.2 树结构的计算机存储形式 1.6.3 二叉树的定义 1.6.4.二叉树的遍历 1.6.5 创建二叉树 1.6.6 实例与分析 1.7 图结构 1.7.1 图的概念 1.7.2 图的存储形式 1.7.3 邻接表的定义 1.7.4.图的创建 1.7.5 图的遍历(1)——深度优先搜索 1.7.6 图的遍历(2)——广度优先搜索 1.7.7 实例与分析 第2 常用的查找与排序方法 2.1 顺序查找 2.2 折半查找 2.3 排序的概述 2.4 直接插入排序 2.5 选择排序 2.6 冒泡排序 2.7 希尔排序 2.8 快速排序 第3 常用的算法思想 3.1 什么是算法 3.2 算法的分类表示及测评 3.2.1 算法的分类 3.2.2 算法的表示 3.2.3 算法性能的测评 3.3 穷举法思想 3.3.1 基本概念 3.3.2 寻找给定区间的素数 3.3.3 TOM的借书方案 3.4 递归与分治思想 3.4..1 基本概念 3.4.2 计算整数的划分数 3.4.3 递归的折半查找算法 3.5 贪心算法思想 3.5.1 基本概念 3.5.2 最优装船问 3.6 回溯法 3.6.1 基本概念 3.6.2 四皇后问求解 3.7 数值概率算法 3.7.1 基本概念 3.7.2 计算定积分 第2部分 编程实例解析 第4 编程基本功 4.1 字符类型统计器 4.2 计算字符的ASCII码 4.3 嵌套if.else语句的妙用 4.4 基于switch语句的译码器 4.5 判断闰年 4.6 指针变量作参数 4.7 矩阵的转置运算 4.8 矩阵的乘法运算 4.9 巧用位运算 4.10 文件的读写 4.11 计算文件的大小 4.12 记录程序的运行时间 4.13 十进制/二进制转化器 4.14 打印特殊图案 4.15 打印杨辉三角 4.16 复杂级数的前n项和 4.17 寻找矩阵中的“鞍点” 4.18 n阶勒让德多项式求解 4.19 递归反向输出字符串 4.20 一年中的第几天 第5 数学趣(一) 5.1 舍罕王的失算 5.2 求两个数的最大公约数和最小公倍数 5.3 歌德巴赫猜想的近似证明 5.4 三色球问 5.5 百钱买百鸡问 5.6 判断回文数字 5.7 填数字游戏求解 5.8 新郎和新娘 5.9 爱因斯坦的阶梯问 5.10 寻找水仙花数 5.11 猴子吃桃问 5.12 兔子产仔问 5.13 分解质因数 5.14 常胜将军 5.15 求兀的近似值 5.16 魔幻方阵 5.17 移数字游戏 5.18 数字的全排列 5.19 完全数 5.20 亲密数 5.21 数字翻译器 5.22 递归实现数制转换 5.23 谁在说谎 第6 数学趣(二) 6.1 连续整数固定和问 6.2 表示成两个数的平方和 6.3 具有特殊性质的数 6.4 验证角谷猜想 6.5 验证四方定理 6.6 递归法寻找最小值 6.7 寻找同构数 6.8 验证尼科彻斯定理 6.9 三重回文数字 6.10 马克思手稿中的数学 6.11 渔夫捕鱼问 6.12 寻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值