如何使用递归分而治之法实现基于模板的max()函数。

YUSHUIHE 2016-12-28 09:52:56
此函数有三个参数:一个向量、两个索引值,它们定义了一个索引范围。以中心点为界将向量分为两个子表,然后递归调用max()函数得到每个子表的最大值。整个向量的最大值就是这两个返回值的较大者。
template<typename T>
int max(const vector<T>& v,int first,int last)
{
求此函数的代码。
}
...全文
519 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
YUSHUIHE 2017-02-17
  • 打赏
  • 举报
回复
YUSHUIHE 2017-01-11
  • 打赏
  • 举报
回复
谢谢赵4老师的回答。明白了。
赵4老师 2017-01-09
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
YUSHUIHE 2017-01-08
  • 打赏
  • 举报
回复
ri_aje 2016-12-29
  • 打赏
  • 举报
回复
为啥不用 max element 呢?
ipqtjmqj 2016-12-29
  • 打赏
  • 举报
回复

#include <vector>
#include <stdio.h>
template<typename T>
int max(const std::vector<T>& v,int first,int last)
{
	switch (last - first)
	{
	case 0: return first;
	case 1: return v[last] > v[first] ? last : first;
	default: 
		int i1 = max(v, first, (last + first) / 2);
		int i2 = max(v, (last + first) / 2 + 1, last);
		return v[i2] > v[i1] ? i2 : i1;
	}
} 
int main()
{
	double d[]  = {1.1, 3.1, -2, 3, 13.1, 13, 15, -3, 0};
	std::vector<double> vd(d, d + 9);
	printf("index of max = %d\n", max(vd, 0, 8));
	return 0;
}

ipqtjmqj 2016-12-29
  • 打赏
  • 举报
回复
递归函数有个出口,本题的出口就是first与last相差为1或相等时,就可以返回具体的索引了。 其他情况则递归
YUSHUIHE 2016-12-29
  • 打赏
  • 举报
回复
谢谢#3老师给出的代码,在调用递归函数时,需将last值减去1,否则,会超范围。明白了。
YUSHUIHE 2016-12-28
  • 打赏
  • 举报
回复
这个函数的代码,我编写几天了,调试结果均不正确。请高师给出详细代码。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧