꼬리 재귀 적 형태로 쓰고 싶은 기능이 있습니다. 이 함수는 s
양면 다이 n
번을 굴려서 k
의 합계를 얻는 방법의 수를 계산합니다. this answer에서이 함수의 수학적 솔루션을 보았습니다. 그것은 다음과 같다 :컨볼 루션 (convolution) 기능을 꼬리 재귀 적 형태로 작성할 수 있습니까?
R 나의 참조 재귀 구현이 : 나는이 this answer에서 배운대로 스타일을 통과 계속에서 함수를 다시 쓰기 위해 노력했다
sum_ways <- function(n_times, k_sum, s_side) {
if (k_sum < n_times || k_sum > n_times * s_side) {
return(0)
} else if (n_times == 1) {
return(1)
} else {
sigma_values <- sapply(
1:s_side,
function(j) sum_ways(n_times - 1, k_sum - j, s_side)
)
return(sum(sigma_values))
}
}
하지만, 나는 성공하지 못했습니다. tail-recursive 형식으로이 함수를 작성하는 방법이 있습니까?
편집
나는 R은 꼬리 재귀 최적화하지 않는다는 것을 알고있다. 내 질문은 R 특정하지 않습니다, 다른 언어로 솔루션을 환영합니다. 꼬리 재귀를 위해 최적화되지 않는 언어 인 경우에도 마찬가지입니다.
봐 :
여기 파이썬에서 계속-통과 스타일로 변환 (하지 적절한 꼬리 전화를 가지고 다른 언어를)입니다. –
@ 42- 이것에 대해 배울 수있어서 기쁩니다. 고맙습니다.하지만 함수의 이름을 변경하는 데 문제가 없으므로 도움이 될 것입니다. – refik
재귀는 매우 효율적인 구현이 아닙니다. 이 경우 동적 프로그래밍/메모를 사용하여 이미 계산 된 'f'값을 저장하고 재사용하십시오. –