【发布时间】:2009-07-23 22:52:36
【问题描述】:
在我上大学的时候,我们有一个来自 David Parnas 的客座讲座。在其中他提到了一种机制,用于保证循环(while 循环、for 循环等)在某个时刻安全退出。他嘲笑没有人知道它是什么的事实……可悲的是,多年后我也不知道。有谁知道这个机制叫什么?
【问题讨论】:
标签: language-agnostic language-features
在我上大学的时候,我们有一个来自 David Parnas 的客座讲座。在其中他提到了一种机制,用于保证循环(while 循环、for 循环等)在某个时刻安全退出。他嘲笑没有人知道它是什么的事实……可悲的是,多年后我也不知道。有谁知道这个机制叫什么?
【问题讨论】:
标签: language-agnostic language-features
从他的专业领域(包括正确性的正式证明)来看,我认为他的意思是loop variant,这是一种用于证明循环终止的通用技术。
【讨论】:
这个问题似乎不合逻辑。
除了创建一个你知道会被命中的后置条件之外,没有任何保证可以确保循环退出,即增加一个计数器,不要触摸循环内的计数器,并有一个最大值来命中。
您还可以创建一个计时器或其他结构来检查循环是否耗时过长。
Parnas 在这里暗示了什么?通用退出任何不干扰逻辑或仅设计适当后置条件的循环?
【讨论】:
有很多方法可以保证循环安全退出:
说真的,最好的方法是保持简单,并拥有一个稳定且经过全面测试的终止条件(即检查是否应该运行另一次迭代或退出的代码)。
你所描述的很可能被翻译成halting problem,这是一个众所周知的问题,没有解决方案。
此外,谷歌搜索显示大卫帕纳斯在利默里克大学工作,你可以打电话给他们并要求与他交谈。我相信他会很高兴你还在努力学习他当时教你的东西:)
【讨论】:
您的客座讲师可能提到了 Cycle Detection,这是一种检测无限循环的方法。
This blog post 描述了检测链表中的无限循环。有趣的是,它使用与维基百科文章相同的术语。
【讨论】: