我想做一些类似以下的事情。这是一个欧几里得算法。
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__()发布于 2014-09-19 17:27:49
这肯定是我见过的欧几里德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,那么递归堆栈就会爆炸。
无论如何,我决定清理你的代码,去掉多余的块,以防其他人想要跟踪算法来了解它的工作原理。
#! /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()我想你会同意我的版本更具可读性。:)
https://stackoverflow.com/questions/25928184
复制相似问题