调用已存在于callstack中的函数

时间:2014-09-19 07:02:51

标签: python callstack

我想做类似以下的事情。这是欧几里德的算法 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__()

1 个答案:

答案 0 :(得分:2)

这是我见过的Euclid GCD算法中最疯狂的实现! :)由于它使用递归减法,因此效率不高。 OTOH,我想这很有趣,特别是因为它是自动生成的。 (它是如何自动生成的,BTW?)

我通常使用:

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,它实际上并没有做任何事情。它。 :)

另请注意,如果其中一个参数<= 0,那么递归堆栈就会爆炸。

无论如何,我决定清理你的代码&amp;摆脱冗余块,以防止其他人想要追踪算法以查看其工作原理。

#! /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()

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