编写一个递归函数 invert(int a[],int k)将指定数组前K个元素逆置
#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;}#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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出