【发布时间】:2017-06-07 22:09:15
【问题描述】:
我正在学习如何将递归应用于数组。
例如,我通常以迭代方式读取数组,这样:
void read_array(int *a, int n){
int i;
for(i = 0; i < n; ++i)
scanf("%d", &a[i]);
return;
}
我想递归地读取一个数组。我写了以下函数:
void read_array(int *a, int n){
int i = n - 1;
if (n < 0)
return;
else{
if(scanf("%d", &a[n - 1 - i]) == 1){
read_array(a, n - 1);
return;
}
}
}
它可以编译,但在运行时会引发分段错误错误。它让我感到困惑,因为该函数考虑了一个应该停止它的基本情况 0。
【问题讨论】:
-
首先
n的初始值是多少?它是数组中的最大索引还是元素数?您为数组分配了 空间?并使用调试器逐行单步执行代码,同时监控变量及其值以及所有操作的结果。 -
你为什么使用
scanf来读取数组?printf可以做到这一点,而不会成为 C 编程中最复杂的函数。还是我误解了您所说的“阅读”是什么意思? -
@Worice 之所以给学生讲递归,是因为当学生后来成为老师时,可以给学生讲递归。
-
除了玩笑之外,递归被大大高估了,在现实世界的编程中没有太多的位置。将数学和算法理论转化为实用的东西在很大程度上是一次失败的尝试。唯一的实际用途非常狭窄,例如在实现二叉搜索树时,您想要优化树占用的内存,代价是执行速度和峰值堆栈使用。 99% 认为他们找到了递归用途的人是错误的。主要是浪费时间:执行时间、学生时间、代码阅读器时间。
-
@Lundin 抱歉,这是您的意见,所以不在这里讨论这个问题。递归是一个概念,无论你想要什么,它都可以用于好的目的或坏的目的。但是你不能说这个概念不好,这是你的意见。