2016-06-30 3 views
0

R에서 다음과 같은 python 함수를 구현하려고했습니다. 여기에서 주요 함수는 함수 내에서 호출하는 것입니다.R에서 재귀 소작 알고리즘이 무한 재귀로 연결

러시아어 농민 알고리즘
def rec_russian(a, b): 
    if a == 0: 
     return 0 
    if a % 2 == 0: 
     return 2 * rec_russian(a/2, b) 
    return b + 2 * rec_russian((a-1)/2, b) 

기능

rec_russian <- function(a, b) { 
    if(a == 0) {   
    return(0) 
    } else { 
    a %% 2 == 0 
    return(2 * rec_russian(a/2,b)) 
    } 
    return(b + 2 * rec_russian((a-1)/2,b)) 
    } 

rec_russian(3,4) 

하지만 다음과 같은 오류 받고 있어요의 R 표현의

재귀 에디션 :

Error: evaluation nested too deeply: infinite recursion/options(expressions=)? 
Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)? 

답변

2

I을 너 생각해. 할 rying : if {…} else {…} : Does the line break between “}” and “else” really matters? 거기에 내 대답 :

rec_russian <- function(a , b){ 
    if(a == 0){ 
    return(0) 
    } else if (a %% 2 == 0) { 
    return(2*rec_russian(a/2,b)) 
    } else { 
    return(b + 2*rec_russian((a-1)/2,b)) 
    } 
} 
rec_russian(3,4) 
# 12 

또한 관련

R.

에서 제어 문 ?Control에 읽기를 가지고는이 게시물입니다. 그리고 쓸 수 있다는 것을 배울 것입니다

rec_russian <- function(a , b){ 
    if(a == 0){ 
    return(0) 
    } 
    else if (a %% 2 == 0) { 
    return(2*rec_russian(a/2,b)) 
    } 
    else { 
    return(b + 2*rec_russian((a-1)/2,b)) 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 그것은 매우 상세했습니다! – Beta

3
rec_russian <- function(a , b){ 

    if(a == 0) return(0) 

    if (a %% 2 == 0) return (2*rec_russian(a/2,b)) 

    return (b + 2*rec_russian((a-1)/2,b)) 
} 
rec_russian(3,4) 
+0

답장을 보내 주셔서 감사합니다. 당신이 한 것처럼 "if"문을 사용하지 않았습니다. 당신의 대답에서 좋은 학습입니다. 그러나 나는 Li의 대답을 옳은 것으로 표시했다. 왜냐하면 그는 내가 실수를하고있는 곳을 자세하게 설명했기 때문이다. 답장을 보내 주셔서 다시 한 번 감사드립니다. – Beta

+0

내 코드는 직접 파이썬 코드의 직접 번역입니다. else 문없이 if 문을 사용할 수 있습니다. 'return'이 함수를 종료하기 때문에 여기에서 그렇게하는 것이 합리적입니다. if 조건 중 하나라도 만족하면 함수가 멈추고, else else를 생략 할 수 있습니다. – toni057