基于循环的逆推法和顺序法
1.逆推法
原理:基于不满足条件,跳出循环
int a=0;
while(a!=5)
{
b=a;
a++;
}
求b等于多少?此处可以用逆推法
a=5跳出循环,即上一个循环末尾a的值为5,

SLTNode* prev = NULL;
SLTNode* tail = *pphead;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
问:prev为链表的那个节点?逆推法最好用
int a=0;
while(a!=5)
{
b=a;
a++;
if(b=2)
{
pirnt(a)
}
}

2. 顺序法
初始值为 0 然后a++ a!=7
则在循环内部 a的范围为0~6(7的前一位)
int a=0;
while(a!=7)
{
b=a;
print("%d",b)//0 1 2 3 4 5 6
a++;
}
初始值为 9 然后a-- a!=5
则在循环内部 a的范围为9 8 7 6(5的前一位)
9>=a>5 9(包含)~5(不包含)
向前走,走的7位置后,逆着原方向走一位,
9向5流动,5为阻截点。流到6就截止了。
int a=9;
while(a!=5)
{
b=a;
print("%d",b)//9 8 7 6 **5**
a--;// a的值为 8 7 6 5
}


二种方法都可以用,谁好用谁。
最快的方法是,逆推法找最后一个循环结束的值,
顺序法找a的第一个循环结束值。
当然当循环简单,没必要使用,复杂时,可以采用此方法
3.模拟法
需要实现代码更具体细节,可用此方法。
4.while的一些特殊用法
while(k–) k次循环
int a = 9;
while (a--)
{
printf("%d\n", a); //(8,7,6,5,4,3,2,1,0)
//a-1次循环
}
while(–k) k-1次循环
int a = 9;
while (--a)
{
printf("%d\n", a); //(8,7,6,5,4,3,2,1)
//a-1次循环
}
条件A为0(为假命题),则等效于条件A的取反为真命题。
//死循环,怎么快速判断呢?
int a = 9;
int b = 0;
while (a!=2 || b!=12 )
{
printf("a=%d b=%d\n", a,b);
a--;
b++;
}
关于命题的概念,如果a为真命题,则~a必定为假命题。
(a!=2 || b!=12 ) 为 假命题(即值为0)
则~(a!=2 || b!=12 )为真命题 则a=2 && b=12
int a = 9;
int b = 0;
while (a!=2 && b!=12 )
{
printf("a=%d b=%d\n", a,b);
a--;
b++;
}
~(a!=2 && b!=12 ) a=2或者 b=12 都可以 跳出循环
总结:想跳出循环,对条件取反即可。
while(L1!=NULL && L2!=NULL)
怎么样会继续执行呢?
L1不为空和L2不为空,也就是二个都不为空,都成立 才能继续
那么至少有一个为空,就会跳出循环
原理:条件A&&条件B
为1 必要条件 为A和B 都成立 (且)
为0 必要条件 为A和B 至少有一个条件不成立(存在不成立,有几个不成立,可以都不成立)
原理:条件A||条件B
为1 必要条件 为A和B 至少有一个条件成立 (或)
为0 必要条件 为A和B 都不成立
while(L1!=NULL || L2!=NULL)
L1不为空或L2不为空,L1和L2有至少一个不为空,都成立
当二个都不为空,就会跳出循环。



我们希望(pos < ps->size || pos>0) 为真
但是assert接受为假的命题才执行,也就说(pos < ps->size || pos>0) 为真命题 把其等效转换成
!(pos < ps->size || pos>0)为假命题,这样就可以执行异常了。

243

被折叠的 条评论
为什么被折叠?



