파이썬의 함수 매개 변수는 참조가 아닌 값으로 전달됩니다. 함수에 숫자를 전달하면 함수는 해당 숫자의 사본을받습니다. 함수의 매개 변수를 수정하는 경우, 그 변화는 함수 밖에 볼 수 없습니다 : 귀하의 경우
def foo(y):
y += 1
print("y=", y) # prints 11
x = 10
foo(x)
print("x=", x) # Still 10
을, 가장 직접적인 수정은 전역 변수로 클릭률을 확인하는 것입니다. 매우 추한 이유는 collatz 함수를 다시 호출하기를 원할 경우 글로벌을 다시 0으로 재설정해야하기 때문입니다. 그러나 참조 비트를 제외하고 로직이 정확한지 보여주기 위해이 대안을 보여줍니다. (collatz 함수는 현재 아무것도 반환하지 않으며, 응답은 전역 변수에 있음을주의하십시오.)파이썬은 꼬리 호출 최적화되어 있지 않기 때문에 collatz 순서가 이상 1,000 단계 (이 비단뱀 기본 스택 한계입니다) 인 경우
ctr = 0
def collatz(num):
global ctr
if(num != 1):
ctr+=1
if(num%2==0):
collatz(num/2)
else:
collatz(num*3+1)
ctr = 0
collatz(9)
print(ctr)
, 현재 재귀 코드는 스택 오버 플로우와 충돌합니다. 재귀 대신 루프를 사용하면이 문제를 피할 수 있습니다. 이것은 또한 문제가있는 전역 변수를 제거하는 데 사용할 수 있습니다. 최종 결과는 내 의견으로는, 좀 더 관용적 인 파이썬입니다 :
def collats(num):
ctr = 0
while num != 1:
ctr += 1
if num % 2 == 0:
num = num/2
else:
num = 3*num + 1
return ctr
print(collatz(9))
당신이 재귀 함수를 사용하여 고수 할 경우, 그 당신이하려고하는 같은 가변 할당을 사용하지 않는 것이 보통 청소기. 함수를 상태를 수정하는 "서브 루틴"대신에 값을 받고 입력에만 의존하는 결과를 반환하는 수학 함수에 더 가깝게 만듭니다. 이렇게하면 재귀에 대해 추론하는 것이 훨씬 쉬울 수 있습니다. 나는 운동을하지만 재귀 함수는이하는 것입니다의 전형적인 "골격"로이 떠날 경우 기본 케이스와 재귀 경우에 검사 문 :
def collatz(n):
if n == 1:
return 0
else if n % 2 == 0:
# tip: something involving collatz(n/2)
return #???
else:
# tip: something involving collatz(3*n+1)
return #???
가 의도 한 결과 무엇이며, 당신이 원하는 이것으로 달성할까요? – harshil9968
'ctr = collatz (num // 2, ctr)'. 또한 파이썬 3에서 작업해야하며'/ 2'는 부동 소수점 나누기입니다. '// 2'는 정수 나누기입니다. –