要想倒序打印,第一个想到的就是使用栈实现:将元素按照顺序都压入栈中,依次弹出并打印就实现了倒序打印。
大家想一想,其实递归就是天生的栈结构。所以,使用递归来实现数组的倒序输出,虽然效率可能不太好。
代码1:
#include <stdio.h> #include<iostream> using namespace std; void foo(int *p,int length,int index) { if(index<length-1) { foo(p,length,index++); } printf("%d\n",p[index]); } int main() { int array[5]={1,2,3,4,5}; foo(array,5,0); system("pause"); return 0; }
看看代码有什么问题?运行会发现有中断错误。问什么呢?原因在这里:foo(p,length,index++);
index++做为参数传递是这样一个过程,index先把数值传递出去,再自加。这样一来每次传递出去的都是0。
小伙伴灵机一动,那就换成++index不就行了。上代码:
#include <stdio.h> #include<iostream> using namespace std; void foo(int *p,int length,int index) { if(index<length-1) { foo(p,length,++index); } printf("%d\n",p[index]); } int main() { int array[5]={1,2,3,4,5}; foo(array,5,0); system("pause"); return 0; }
运行看结果:
5
5
4
3
2
什么情况!!!仔细分析:虽然++index是自加之后传递出去了加1的值。但是index自身也加1了。导致在递归返回的时候printf("%d\n",p[index]);中的index已经是加1之后的index了。所以出现了上述输出结果。
解决办法有很多:foo(p,length,index+1);传递index+1这个值就行了。无需改变别的变量。
大家想一想,如果保持++index,而修改printf("%d\n",p[index-1]);可以吗?
当然不行!!!这样最后一个元素无法输出的:
//运行结果
4
4
3
2
1