编写一个递归函数 invert(int a[],int k)将指定数组前K个元素逆置

Flammable_ice 2012-06-28 11:56:10

#include <iostream>
using namespace std;
void invert(int a[],int k)
{
cout<<k<<endl;
int t;
if (k>1)
{
invert(a+1,k-2);
cout<<"a[0]"<<a[0]<<"a["<<k-1<<"]"<<a[k-1]<<endl;
t=*(a+1-1);
*(a+1-1)=*(a+k-1);
*(a+k-1)=t;
}
}
int main()
{
int b[10]={1,2,3,4,5,6,7,8,9,10};
int i;
invert(b,7);
for (i=0;i<10;i++)
{
cout<<b[i]<<" ";
}
return 0;
}

//如果输出交换前的a[0]与a[k-1]会发现a[0]分别按3,2,1顺序输出而a[k-1]分别按a[2]=5,a[4]=6,a[6]=7输出,对此我表示很不解,a[0]不是1吗?怎么还能有变化?a[2]不是3吗?怎么是5?a[4]不是5吗?怎么是6?
...全文
550 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongzhipeng5699 2012-06-29
  • 打赏
  • 举报
回复
楼主之所以产生疑问是没注意递归的方式
invert(a+1,k-2);
每一次递归 函数栈内的局部变量a都往后移了一位,把数组定义成全局变量,比较之下可以看出这一点

递归的原理可以这样理解
1 2 3 4 5 6 7
将首尾 1 和 7 交换 之后再对 2 3 4 5 6处理,去掉首尾后,此时需要逆置的元素个数-2。
也就是 insert(a+1,k-2);//指针前移动一位,数量-2



#include <iostream>
using namespace std;

int b[10]={1,2,3,4,5,6,7,8,9,10};

void invert(int a[],int k)
{
cout<<k<<endl;
int t;
if (k>1)
{
invert(a+1,k-2);//每一次递归,a都往后移动了1位
cout<<"a[0]"<<a[0]<<"a["<<k-1<<"]"<<a[k-1]<<endl;

cout<<"b[0]"<<b[0]<<"b["<<k-1<<"]"<<b[k-1]<<endl;
t=*(a+1-1);
*(a+1-1)=*(a+k-1);
*(a+k-1)=t;
}
}
int main()
{

int i;
invert(b,7);
for (i=0;i<10;i++)
{
cout<<b[i]<<" ";
}
return 0;
}


Flammable_ice 2012-06-29
  • 打赏
  • 举报
回复
书上关于数组元素逆置的方法有三种,第一种是非递归和我想法一样于是就PASS过了,第二种是递归也很容易相通,第三种就是这种递归,理解起来有困难,所以才来请教各位大神来帮忙看看啦 小弟先谢谢啦O(∩_∩)O哈!
pathuang68 2012-06-29
  • 打赏
  • 举报
回复
说实话,这样的问题不太适合用递归来解,用循环就非常直观,效率还高。
Flammable_ice 2012-06-29
  • 打赏
  • 举报
回复
多谢大家 可以结贴了
赵4老师 2012-06-29
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

65,199

社区成员

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

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