【问题标题】:How do I avoid non-halting functions?如何避免非停止功能?
【发布时间】:2014-05-06 16:08:14
【问题描述】:

我正在尝试在 Python(或伪代码)中为给定的函数列表 [f1,...,fn] 找到一种编写高级函数的算法 - 不必停止 -并且给定的输入列表 [x1,...,xn] 仅打印一次 fi(xj)(表示所有函数和输入对)。

当然,实现这一点的天真的建议是:

for f in lst1:
   for x in lst2:
      f(x)

但问题是某些函数可能会在某些输入上永远循环。

我可以使用步进器(它有一个 step() 方法,每次调用该函数都会执行一个后续计算步骤)

我只需要一个想法或算法如何做到这一点。

【问题讨论】:

  • 当然,您只想打印暂停的计算结果?
  • @delnan 是的,这是真的。
  • 这不只是停机问题([en.wikipedia.org/wiki/Halting_problem)吗? ....已知没有解决方案...您如何检测它是否永远循环?
  • @JoranBeasley 你不需要。看我的回答。
  • @user2357112 你的意思是undecidable

标签: python halting-problem


【解决方案1】:

对此的一般概念是配合。您不必尝试运行每个备选方案以完成,而是交错各种备选方案。例如,给定三个计算 c1、c2、c3:

  • 运行 c1 的第 1 步
  • 运行 c2 的第 1 步
  • 运行 c3 的第 1 步
  • 运行 c1 的第 2 步
  • 运行 c2 的第 2 步,它终止
  • 运行 c3 的第 2 步
  • 运行 c1 的第 3 步
  • 运行 c3 的第 3 步
  • ...

如果一个计算停止,这个过程在有限时间内达到它的停止状态,不管有多少其他计算没有停止。以这种方式运行 k 个计算只会将每个计算减慢 k 倍。由于这可能是家庭作业,因此我不会详细说明如何将其应用于您的具体问题。

当然,如果任何计算没有停止,这也不会停止。这是不可避免的(参见停止问题)并且不是问题,因为您将在进入无用的无限循环之前完成那些 停止 停止(在您的情况下:输出它们的结果)。

【讨论】:

  • 这是我发布的链接通过生成器和简单的基于队列的调度程序所做的。
  • 虽然显然这个解决方案确实需要每一步都停止。
  • @aruisdante 当您使用任意生成器时这是一个问题,但当您将计算拆分为可以随意执行的离散、短步骤时则不会。或者当您进行抢先调度时:-)
  • 当然,但是假设你在 python 的约束内工作,你不能在外部抢占它的调用堆栈(据我所知):p 正确的解决方案当然是多线程,但我认为这不是分配的重点,我们都认为这基本上是在 python 中构建一个“线程”环境。
  • @aruisdante 请注意,该作业有一个 step 函数,它可能满足此工作的要求。
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多