【问题标题】:While loop not iteratingWhile循环不迭代
【发布时间】:2017-01-28 03:46:48
【问题描述】:

一切都是正确的,但我的 while 循环中发生了什么。 我正在尝试递归地编写这个函数,这就是我想出的。

def fp(f, guess, error=0.0000000000001):
    p_guess = guess
    c_guess = f(p_guess)
    iterations = 0
    while not close(p_guess, c_guess, error=error):
        next = f(guess)
        iterations += 1
        return fp(f, next, error=error)
    return (iterations, c_guess)

def fp_sqrt(x):
    return fp(lambda y: (y + x/y)/2, 1.0)

我知道我错过了一些东西。有人告诉我将 return 语句从 while 循环的范围中取出,但这只是一个无限循环。

从外壳:

fp_sqrt(2)

预期输出: (5, 1.414213562373095)

我的输出: (0, 1.414213562373095) 所以变量不会增加以显示我在循环中经历了多少次迭代。

【问题讨论】:

  • 如果我把它带出范围,我不会有两个返回语句吗?这不是问题吗?
  • 代码似乎有些混乱。要么做一些递归的事情,要么使用循环。不要试图同时使用两者。如果是递归的,它应该是你试图计算的函数调用——而不是循环迭代。
  • 很抱歉,作业只想编辑 while 循环内的代码,而不更改其他任何内容。这就是我想出的,但是是的......有没有更好的方法来做我想做的事情?
  • 回答你原来的问题:当p_guessc_guess 接近时递归停止(不管它是什么意思)。在这种情况下,while 循环进行零次迭代。 iterations的值,循环前设置为0,不改变,一直返回给调用者。
  • 您的帖子缺少 close(),您可以通过在循环内、函数启动/停止处添加打印语句来开始调试,或者尝试在 pythontutor.com 中运行它

标签: python loops while-loop increment


【解决方案1】:

您不应该使用递归来解决此问题,而应仅通过迭代并将结果重新分配回循环变量来解决,例如:

while not close(p_guess, c_guess, error=error):
    p_guess, c_guess = c_guess, f(c_guess)
    iterations += 1
return iterations, c_guess

#fp_sqrt(2) -> (5, 1.414213562373095)

注意:next 是一个内置函数,你不应该将它用作变量名

您可以使这个递归,但它使 while 只是一个冗长的 if 声明:

while not close(p_guess, c_guess, error=error):  # if would suffice
    iterations, result = fp(f, c_guess, error=error)
    return iterations+1, result
return (0, c_guess)

#fp_sqrt(2) -> (5, 1.414213562373095)

【讨论】:

  • 谢谢你,我做的其他功能都是递归完成的,所以我想我想太多了
  • 我对 python 比较陌生,我从来没有见过这样的事情在一行中完成。是 p_guess = c_guess & c_guess = f(c_guess) 的另一种说法吗??
  • Yes 相当于这两行,p_guess = c_guess; c_guess = f(c_guess)。这是一个标准的元组分配和解包,常用,例如交换值是a, b = b, a,这样就不需要临时变量了。