2014-03-23 3 views
0

저는 계산의 '체인'에 얼마나 많은 '링크'가 있는지에 대한 길이를 얻기 위해 다양한 숫자를 반복하려고합니다. 나는 숫자를 가지고 그 경우에도 물건을 할, 그 이상한 경우 물건을하고 내 코드 1 안타 때까지 계속R에서의 RecuRion - 변수가 전달되지 않습니까?

chainCount <- 0 
chain <- function(n){ 


    if(n %% 2 == 0 && n > 1){ 
    n <- n/2 
    chainCount <- chainCount + 1 
    print(chainCount) 
    chain(n) 

    } 
    else if (n > 1){ 
    n <- 3*n + 1 
    chainCount <- chainCount + 1 
    print(chainCount) 
    chain(n) 

    } 

} 

chain(13) 

기능 수행 13 → 40 → 20 → 10 → 5 16 → 8 → → chainCount 변수가 있지만, 재귀 반복 될 때마다 증가하지 않습니다 어떤 이유 → 2 → 1. 4, 9 단계에있을 때부터,

> chain(13) 
[1] 1 
[1] 1 
[1] 1 
[1] 1 
[1] 1 
[1] 1 
[1] 1 
[1] 1 
[1] 1  

가 나에게 (9)을 제공한다

를 제공하고 있습니다 프로세스의 합계 R과 같은 재귀 적 문제에 대한 특별한 변수 할당이 있습니까? (!주의)

답변

2

이 0으로 설정된 chaincount 변수를 수정하는 것이 아니라 새를 생성 함수 내부 chaincount 변수 :

chainCount <- chainCount + 1 

보십시오

chainCount <<- chainCount + 1 
+0

또는 카운터를 함수에 변수로 전달하면 전역 변수가 필요하지 않습니다. –

2

당신은 당신이이 chainCount 글로벌 업데이트하고 보장하기 위해 "<<-"을 사용해야합니다 :

chainCount <- 0 
chain <- function(n){ 


    if(n %% 2 == 0 && n > 1){ 
    n <- n/2 
    chainCount <<- chainCount + 1 
    print(chainCount) 
    chain(n) 

    } 
    else if (n > 1){ 
    n <- 3*n + 1 
    chainCount <<- chainCount + 1 
    print(chainCount) 
    chain(n) 

    } 

} 

chain(13) 

[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 5 
[1] 6 
[1] 7 
[1] 8 
[1] 9 
+0

범위 지정에 오래하지만 유용한 참고 자료 : http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-scope.pdf 새로운 심지어이 전역 변수를 방지 더 유용한 참조 : http://adv-r.had.co.nz/Functions.html – hrbrmstr

2

정말로 카운터가 필요한 경우 함수의 인수로 전달하십시오.

chain <- function(n, chainCount){ 
    if(n %% 2 == 0 && n > 1){ 
    n <- n/2 
    chainCount <- chainCount + 1 
    print(chainCount) 
    chain(n, chainCount) 

    } 
    else if (n > 1){ 
    n <- 3*n + 1 
    chainCount <- chainCount + 1 
    print(chainCount) 
    chain(n, chainCount) 
    } 
} 

chain(13, 0) 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 5 
[1] 6 
[1] 7 
[1] 8 
[1] 9 
관련 문제