`

递归实现倒序打印数组元素

 
阅读更多

          要想倒序打印,第一个想到的就是使用栈实现:将元素按照顺序都压入栈中,依次弹出并打印就实现了倒序打印。

           大家想一想,其实递归就是天生的栈结构。所以,使用递归来实现数组的倒序输出,虽然效率可能不太好。

                                                                          代码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

分享到:
评论

相关推荐

    2018-2019-2计算机程序设计基础II第1次月考试题1

    11. **数组输入**:题号40550的程序中,要为数组`a`的所有元素输入数据,应当使用`&a[i]`,因为`scanf`需要一个指向数组元素的指针来接收输入的数据。因此,正确的选项是A。 以上就是这些题目所涉及的主要知识点,...

    C语言编程题老师提供

    23. 打印重复元素及其频率:遍历数组,记录出现次数。 24. 打印特定下标元素:理解二进制表示和位运算。 25. 数组逆序:使用反向索引或交换元素。 星号标记的题目难度稍高: 1. 判断位数:理解整数的十进制表示。 ...

    计算机科学与技术第3次上机实验.pdf

    最大值的查找通过假设第一个元素为最大值,然后逐个比较数组元素,如果当前元素大于之前的最大值,则更新最大值。最小值的查找过程类似,但使用了另一个数组同步存储,以便在遍历过程中比较。这个实验强调了比较操作...

    javascript入门笔记

    3、如何 将变量的数据 打印在控制台上?? 4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误...

    java 按相反的顺序输出

    在Java编程语言中,"按相反的顺序输出"通常指的是逆序打印数组、字符串或者其他集合类型的数据。这个任务可以通过多种方式实现,包括迭代和递归等方法。下面将详细讲解几种常见的逆序输出方法。 首先,让我们从最...

    Java 微软面试题

    5. **有序数组到二叉树**:可以使用中序遍历的方式,将数组元素依次插入到二叉搜索树中。 6. **逐层打印二叉树**:可以使用层次遍历,借助队列实现。 7. **链表反转**:可以使用迭代或递归方式,改变链表的next...

    自己写的C语言的一些简单程序~(包括简单链表等)

    在这里,数组主要涉及到二维数组的处理,包括数值翻倍、打印数组、输入数组、求最大值和平均值。 10. **结构体**: 结构体用于组合不同类型的变量,例如可以定义一个包含学号和姓名的学生结构体,进行输入、检索...

    数据结构期中考试试题【上半场】(含答案)

    3. **递归调用**: 对子数组进行递归调用,返回子数组的最大值,并与当前元素进行比较。 **测试案例分析**: - **案例1**: 输入`1 2 3 4 5 6 7 8 9 10`,输出结果为`10.00`。 - **案例2**: 输入`1.1 -2.2 3.3 -4.4 ...

    各大软件公司JAVA常用面试题.docx

    在Java面试中,这些问题涵盖了多个核心概念和技术,包括字符串操作、数组排序、设计模式、接口实现、面向对象编程、集合操作、多线程、递归以及框架理解。以下是对这些问题的详细解答: 1. 字符串倒序:可以使用...

    非常好的Java练习题

    这些Java练习题覆盖了基础到进阶的多个知识点,包括条件运算符的使用、循环与逻辑控制、字符串处理、数学计算、递归、数组操作、数据结构、算法等。以下是这些题目涉及的具体知识点详解: 1. **条件运算符**:`条件...

    C语言趣味程序50绝对没有错误

    冒泡排序通过重复遍历数组,比较相邻元素并交换它们(如果顺序错误)来工作,直到整个数组有序。而选择排序则在每次迭代中查找未排序部分的最小元素,并将其放到正确的位置。这两个示例提供了对两种基本排序算法的...

    明日科技C#开发入门及项目实战

    实例056 删除数组元素后改变其长度 第6章 c#面向对象程序设计 实例057 创建类的对象 实例058 使用构造函数 实例059 通过定义方法求一个数的平方 实例060 使用重载方法实现不同类型数据的计算 实例061 使用属性存储...

    c语言课设模板

    - 在设计员工信息管理程序时,可以使用结构体指针,方便地操作结构体数组中的元素。 完成上述任务,不仅需要扎实的C语言基础知识,还需要良好的编程实践和问题解决能力。通过这样的课程设计,学生能够进一步提升...

    数据结构及算法实训内容及要求.pdf

    - **插入**:在指定位置或末尾插入一个元素,需要考虑数组的扩容问题。 - **查找**:按给定值查找元素,记录比较次数。 - **删除**:删除指定位置的元素,并更新后续元素的位置,记录移动次数。 - **排序**:...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例056 删除数组元素后改变其长度 90 第6章 c#面向对象程序设计 92 实例057 创建类的对象 93 实例058 使用构造函数 94 实例059 通过定义方法求一个数的平方 95 实例060 使用重载方法实现不同类型数据的计算 97 实例...

    对串的所有操作都可以通过以下五个基本函数实现.doc

    3.9 初始的迭代过程`ditui`被改写为递归过程`digui`,将打印从`j`到1的倒序数字。 3.10 递归过程`test`被改写为非递归过程,利用栈`S`保存未处理的输入,先读取所有输入值压入栈,然后在栈非空时弹出一个值,累加到...

    C语言面试题总汇.doc

    17. **递归判断递增数组**:通过递归函数检查数组的相邻元素关系,若所有元素均大于等于前一个元素,则为递增数组。 18. **找出最大值**:在大量浮点数中找出最大的10000个,可以利用外部排序算法。 19. **数组...

    C语言编程题精选

    - **解析**:实现冒泡排序算法对数组进行排序,再实现插入排序保持数组有序。重点在于理解冒泡排序的原理及其优化,以及如何在已排序数组中插入新元素并保持排序状态。 #### 题目十二:数组排序与查找 - **知识点**...

    大神总结的算法C语言版,非常适合基础学

    可以通过遍历数组,初始化最大值、最小值为数组第一个元素,累加和为0,然后逐个与数组元素比较更新。 7. **杨辉三角形**: 杨辉三角形是组合数学中的一个重要概念,用于展示二项式系数。可以使用二维数组来实现...

Global site tag (gtag.js) - Google Analytics