我想做类似以下的事情。这是欧几里德的算法
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__()
答案 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()
我想你会同意我的版本更具可读性。 :)