Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 循环解释的反转_Arrays_Loops_For Loop_Reverse - Fatal编程技术网

Arrays 循环解释的反转

Arrays 循环解释的反转,arrays,loops,for-loop,reverse,Arrays,Loops,For Loop,Reverse,Java程序: int[] a = new int[] { 1, 2, 3, 4} int N = a.length; for (int i = 0; i < N/2; i++) { double temp = a[i]; a[i] = a[N-1-i]; a[N-i-1] = temp; } int[]a=新的int[]{1,2,3,4} int N=a.长度; 对于(int i=0;i

Java程序:

int[] a = new int[] { 1, 2, 3, 4}

int N = a.length;

for (int i = 0; i < N/2; i++)
{
double temp = a[i];
a[i] = a[N-1-i];
a[N-i-1] = temp;
}
int[]a=新的int[]{1,2,3,4}
int N=a.长度;
对于(int i=0;i
有人能解释为什么N/2出现在for循环中吗? 如果我干运行它,最初用于:
i=0,0要反转数组的顺序,只需将数组一分为二,然后交换距中间相同距离的元素的位置

例如,如果有
{1,2,3,4,5}
,则中间将是3,而2和4与中间的距离相同。如果按照此模式开始交换,则将2与4交换,1与5交换。结果的顺序是
{5,4,3,2,1}

可以使用迭代数组长度一半的
N/2
for
循环来实现这一点。对于每个循环,只需要知道两个值,当前位置
i
的值和另一侧的对应值。这就是
N-1-i
所做的,它从数组的最后一个元素开始计数,而
i
从开始计数


基本上,
a[i]=a[N-1-i]
a[N-i-1]=temp
所做的是使数组的第一个元素等于最后一个元素,最后一个元素等于第一个元素的原始值,在下一个循环中,第二个元素等于最后一个元素的第二个元素,等等。。。它不需要在
N/2
之后继续检查元素,因为它们已经被更改了。

在本例中,for循环没有问题,它只会运行两次:for
i=0
i=1

N/2=2
根据i=2执行循环的问题,但这不会发生

尝试在for循环中添加print语句并计算print语句出现的次数,您将看到只有2个。通过调试器运行代码也是一个选项


修改后的最终输出:
4,3,2,1
,这不是期望的结果吗?

如果数组的大小是奇数,该怎么办?@GeethWijewickrama在上面的示例中,数组有5个元素。5除以2=2.5。因为
N
是一个
int
,所以它会丢弃小数部分,导致
N=2
。循环将迭代直到
i=1
,这意味着在此算法中,它将交换除中间元素以外的所有元素。中间不必交换,因为它是在中间,那么它是什么时候呢?如果数组是{1,2,3,4},那么这里的n/2值将是2。那么交换是如何进行的。同样,将迭代直到
i=1
,用4交换1,用3交换2,然后停止。该算法并不真正“知道”是否存在中间值,它只是将数组分成两等分,并交换相应的值。