【问题标题】:Calling the functions which are already in the callstack [closed]调用已经在调用堆栈中的函数[关闭]
【发布时间】:2014-11-13 17:02:26
【问题描述】:

我想做如下的事情。这是一个欧几里得算法。
1. 为什么我想调用已经在调用堆栈中的函数时它不起作用?
2. 我怎样才能让它工作?

import sys
def __block_1__():
        __block_2__()
def __block_2__():
        global b,a
        b,a=None,None
        __block_3__()
 def __block_3__():
        global b,a
        a=int(raw_input())
        __block_4__()
 def __block_4__():
        global b,a
        b=int(raw_input())
        __block_5__()
 def __block_5__():
        global b,a
        if a==b:
                __block_6__()
        else:
                __block_7__()
 def __block_6__():
        global b,a
        __block_8__()
 def __block_8__():
        global b,a
        sys.exit(0)
 def __block_7__():
        global b,a
        if a<b:
                __block_9__()
        else:
                __block_10__()
 def __block_9__():
        global b,a
        b=b-a
        __block_5__
 def __block_10__():
        global b,a
        a=a-b
        __block_5__
__block_1__()

【问题讨论】:

  • 在您的第 9 和第 10 块中,您没有调用 __block_5__,因为您忘记了括号。您的代码也很难阅读。你为什么要把所有这些下划线放在一个地方?
  • 这是一个自动生成的代码。抱歉,我没有注意到这一点。谢谢。

标签: python callstack


【解决方案1】:

这一定是我见过的欧几里得 GCD 算法最疯狂的实现! :) 而且由于它使用递归 减法,因此效率不高。 OTOH,我想这很有趣,尤其是因为它是自动生成的。 (顺便说一句,它是如何自动生成的?)

我通常使用:

def gcd(a, b):
    if a < b:
        a, b = b, a
    while b > 0:
        a, b = b, a%b
    return a

在 Python 中,我们尽量避免使用全局变量,但我想我们可以原谅您的自动生成器的这种罪过。请注意,当您要修改一个全局变量时,您只需要global 语句,而不仅仅需要读取一个全局变量。

除了 BrenBarn 提到的 block_5 调用中缺少括号外,您的程序没有任何类型的输出语句,因此一旦计算出 gcd,它实际上并没有做任何事情它。 :)

另请注意,如果任何一个 args

无论如何,我决定清理您的代码并删除冗余块,以防其他人可能希望通过算法跟踪以了解其工作原理。

#! /usr/bin/env python

''' Calculate the gcd of two positive integers

    Uses a recursive state machine implemetation of the naive form 
    of Euclid's algorithm.

    From http://stackoverflow.com/questions/25928184/calling-the-functions-which-are-already-in-the-callstack

    Modified by PM 2Ring 2014.09.19
'''

def block3():
    global a
    a = int(raw_input('a: '))
    block4()

def block4():
    global b
    b = int(raw_input('b: '))
    block5()

def block5():
    if a == b:
        block8()
    else:
        block7()

def block7():
    if a < b:
        block9()
    else:
        block10()

def block8():
    print a
    exit()

def block9():
    global b
    b -= a
    block5()

def block10():
    global a
    a -= b
    block5()

if __name__ == '__main__':
    block3()

我想你会同意我的版本更具可读性。 :)

【讨论】:

  • 我一直在开发一个教育软件来绘制一个编程流程图并执行它来查看结果。在软件中,每个块代表一个功能。所以它是这样生成的。你可以在这里看到我的程序。 github.com/ggtulga/blockTest
  • 欢迎提出任何建议和意见。
猜你喜欢
  • 2013-04-11
  • 2011-11-21
  • 2014-11-13
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多