2014-09-19 3 views
0

다음과 같이하고 싶었습니다. 유클리드의 알고리즘입니다.
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__() 
+4

블록 9와 10에서 괄호를 잊었으므로 '__block_5__'을 (를) 호출하지 않습니다. 또한 코드를 읽기가 어렵습니다. 왜 너는 그 모든 곳에 밑줄을 긋고 있니? – BrenBarn

+0

자동 생성 된 코드입니다. 죄송합니다. 감사. – ggt

답변

2

내가 본 중 유클리드의 GCD 알고리즘이 가장 미친 구현이어야합니다! :) 그리고 회귀 빼기를 사용하므로 매우 효율적이지 않습니다. OTOH, 흥미 롭습니다. 특히 자동 생성 된 이후입니다. (방법은 BTW, 자동 생성이었다?)

나는 일반적으로 사용 :

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

파이썬에서, 우리는 전역을 사용하지 않도록 노력하지만, 나는 우리가 죄에 대한 귀하의 자동 생성을 용서할 수 같아요. 전역 변수로 수정하려는 경우에만 global 문만 있으면되며 전체적으로 읽을 필요는 없습니다.

BrenBarn이 언급 한 block_5에 대한 호출의 누락 된 괄호 외에도 프로그램에는 출력 문장이 없으므로 gcd를 계산하면 실제로 아무 것도 수행하지 않습니다. :)

args 중 하나가 < = 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() 

내 버전이 좀 더 읽기 쉽다는 것에 동의 할 것입니다. :)

+0

나는 프로그래밍 플로우 차트를 그려 결과를보기 위해 교육용 소프트웨어를 개발해왔다. 소프트웨어에서 각 블록은 하나의 기능을 나타냅니다. 그래서이 방법으로 생성됩니다. 내 프로그램을 여기서 볼 수 있습니다. https://github.com/ggtulga/blockTest – ggt

+0

제안 및 조언을 환영합니다. – ggt