如何在不使用break语句的情况下获得以下代码?
我更新并将i = child添加到while循环的底部。我还添加了这些额外的评论,因为有人编辑了我的帖子,现在我无法更新它,因为我需要添加更多评论。请不要改变我的问题。这些意见是为了获得额外的见解。它还妨碍了我编辑问题或更新代码的能力。
private void percDown(int [] a, int i, int n) {
numOfCalls++;
int child = 0;
int tmp = a[i];
while(leftChild(i) < n) {
child = leftChild(i);
if( child != n - 1 && a[child] < a[child + 1]){
numOfComparisons++;
child++;
}
if( tmp < a[child]){
numOfComparisons++;
a[i] = a[child];
}
else
break;
i= child;
a[i] = tmp;
}
}
答案 0 :(得分:1)
只需设置n = 0;
,或Integer.MIN_VALUE
,如果这些值可以为负值。这将阻止你的循环。但不要反对break
陈述。它们在现实世界中一直被使用。
答案 1 :(得分:0)
条件时尝试此操作:
while(leftChild(i) < n && (( leftChild(i) != n - 1 && a[leftChild(i)] < a[leftChild(i) + 1]) || tmp < a[leftChild(i)]))
基本上我已经在if
条件下同时处理了while
条件。其他一切都是一样的。
答案 2 :(得分:0)
您的代码结构如下:
while(A) {
B;
if(C){
D;
} else {
break;
}
E;
}
整理一下;它可以写成
while(A) {
B;
if(C){
D;
E;
} else {
break;
}
}
为避免使用break,可以通过以下方式完成:
while(A && !C) {
B;
if(C){
D;
E;
}
}
(你可以组成一个有意义的布尔标志来表示C
,这样它就更具可读性,而不是在条件中放入一个冗长,复杂,难以阅读的谓词。)