首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用callstack中已经存在的函数

调用callstack中已经存在的函数
EN

Stack Overflow用户
提问于 2014-09-19 15:02:51
回答 1查看 262关注 0票数 0

我想做一些类似以下的事情。这是一个欧几里得算法。

  1. 当我想要调用已在调用堆栈中的函数时,它为什么不工作?
  2. 我如何使它工作?

代码语言:javascript
复制
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__()
EN

回答 1

Stack Overflow用户

发布于 2014-09-19 17:27:49

这肯定是我见过的欧几里德GCD算法最疯狂的实现了!:)而且由于它使用了递归和减法,所以效率不是很高。OTOH,我猜它很有趣,特别是因为它是自动生成的。(BTW,它是如何自动生成的?)

我通常使用:

代码语言:javascript
复制
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,那么递归堆栈就会爆炸。

无论如何,我决定清理你的代码,去掉多余的块,以防其他人想要跟踪算法来了解它的工作原理。

代码语言:javascript
复制
#! /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()

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25928184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档