首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-08-08 
编写一个递归函数 invert(int a[],int k)将指定数组前K个元素逆置C/C++ code#include iostreamusing nam

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

C/C++ code
#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?

[解决办法]
楼主之所以产生疑问是没注意递归的方式
 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

C/C++ code
#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;}
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

热点排行