좋아,이 질문은 조금 이상하지만, 나는 이것을 이렇게 할 수 있을지 궁금해하고 있었다.파이썬 - 함수에서 사전 수정
저는 프로그래밍에 관심이 많기 때문에 간단한 피보나치 넘버 생성기를 사용하고 있습니다.
def f(n):
if n == 1: return 1
if n == 2: return 2
else:
return f(n-1) + f(n-2)
을하고 내 컴퓨터에 f(30)
을 15 초를 복용, 매우 느리게 실행 : 그래서 나는 이것을 썼다.
{'f(1)':1,'f(2)':2,'f(3)':3,'f(4)':5}
등 : 기본적과 같이 사전에 이전 결과를 저장
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
: 그래서 나는이를 썼다. 함수에서 그 결과가 해당 사전에 있는지 확인한 다음 모든 계산을 다시해야하는 대신 해당 결과를 사용합니다.
이렇게 빨라졌습니다. 나는 f(100)
을 할 수 있고 즉시 나타납니다. 500의 간격으로 가면서, 나는 f(4000)
에 도착했다. 그리고 그것은 아직도 순간이었다. 한 가지 문제는 사전이 어리석게 커지고 있다는 것입니다.
그래서 함수의 끝에 a = {}
을 추가했는데 작동하지 않았습니다. 그것은 여전히 방대한 표제어로 a
을 남겼습니다.
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
a = {}
작동하지 않았다. 나는이 작업을 수행하는 경우 만 :
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
# now run the function
f(100)
a = {}
a
는 빈 사전에 리셋됩니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?
반환하기 전에 a = {}를 추가했습니다. z? – Skycc
@Skycc가 작동하지 않습니다. 그것은 전체 아이디어가 쓸모 없게 렌더링 될 때마다 다시 시작됩니다. 내가하고 싶은 것은 마지막 재귀가 호출 된 후에 사전을 재설정하는 것입니다. "% n in a :"는 반복적으로 호출 할 것이고, else 부분은 마지막 재귀 부분이 될 것이고, return z는 이미 함수를 빠져 나갈 것입니다. – SolarPixelGaming
이상한, 사전의 키를 문자열이 아닌 피보나치 색인 (n, 함수 인수)으로 지정하여 방대한 내용을 축소 할 수 있습니다. 또한이 작업을 재귀 적으로 수행 할 필요가 없습니다. 'a, b = 0, 1; ~에 대한 범위 (n) : a, b = b, a + b' – Skycc