f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
온라인으로 사용해보십시오!
다른 접근법
이 과제를 게시 한 이후로이 문제에 대한 재귀 적 해결책을 찾으려고 노력했습니다. 필자는 펜과 종이 만 사용하는 데 실패했지만 공식을 골프로 바꾸는 데있어 적어도 실용적 정의에 대해서는 실질적인 문제가되어 분석하기가 더 쉬워졌습니다.
다음과 같이 작동 하는 k + m 후보가 있는 게임 쇼를 상상해보십시오 .
1 라운드에서 모든 후보자들은 가능한 빨리 특정 과제를 완수해야합니다. K의 작업을 빠르게 수행 후보이기 1 유전율 $ (하나 kilodollar) 3 라운드 각각 전진.
2 라운드에서 남은 후보 m 명이 다른 k 에 합류 할 두 번째 기회를 얻습니다 . 각 응시자는 질문을받습니다. 그들이 질문에 올바르게 대답하면, 1 k $로 이기고 3 라운드로 진행합니다. 그러나 질문에 대답하지 않으면 게임에서 제외됩니다. 이것은 3 라운드가 질문에 대답 할 수있는 사람의 수에 따라 k 와 k + m 사이의 후보자를 갖습니다 .
3 라운드가 구성되어 m 각 대회에서 1 라운드와 유사하다 더 콘테스트, 참가자들은 특정 작업을 수행해야합니다. 1 라운드와는 달리, 오직 한 명의 후보 만 상을 받지만 모든 후보자는 다음 콘테스트에 참가하게됩니다. 각 콘테스트는 컨테스트보다 2 배의 비용을 지불합니다. 첫번째는 지불 2 유전율 $ 와 마지막 2 분 K을 $ .
모든 상금은 2의 거듭 제곱이므로 후보자가 얼마나 많은 상금을 받았는지 알면 3 라운드로 진출했는지, 3 라운드에서 어떤 콘테스트에서 우승했는지 알 수 있습니다.
게임 쇼를보고 있고 1 라운드가 이미 끝나고 있다고 가정하면 어떤 k 후보가 이미 3 라운드에 도달했는지, 어떤 m 후보가 2 라운드에 여전히 남아 있는지 알고 있습니다. 나머지 상금은 몇 가지 방법으로 분배 할 수 있습니까?
두 번째 라운드의 m 후보 중 3 라운드로 발전한 것을 알고 나면 이 특정 시나리오에서 가능한 결과를 쉽게 계산할 수 있습니다. 만약 j 후보가 승진하면, 라운드 3에 k + j 총 후보가 있고, 따라서 각 콘테스트에 k + j 가능한 결과가 있습니다. 함께 m 3 라운드의 개별 경연이 차종 (k 값의 J +) m 모든 결과 m의 경연.
이제, j는 사이의 값을 취할 수 0 및 m ,에 따라 후보자의 각 수정 값에 대해 라운드 2에 제대로 대답 J , 거기 m의 C의 J 의 다른 조합 J의 우리가 호출 할 경우 라운드 3으로 고급 수 후보 k 라운드 3 후보와 m 라운드 2 후보 g (m, k)에 대해 가능한 총 결과 수는 다음과 같습니다.
k = 1 을 고치면 다음과 같은 특별한 경우가 생겨 원래 문제를 해결하는 새로운 접근 방식이됩니다.
재귀 공식
지금, 당신은 1 라운드 후 광고 중에 잠, 그냥 이렇게의 대상 라운드 3의 마지막 대회에서 우승하고 볼 시간에 일어 났을 것으로 가정 2 미터 케이 $를 . 후보자가 총 상금을 얼마나 받았는지에 대한 정보는 없습니다. 남은 상금은 얼마나 많은 방법으로 분배 될 수 있습니까?
승자가 하나 인 경우 m의 2 라운드의 후보자, 지금 벌써 그들은 라운드에 진출해야합니다 것을 3 . 따라서 우리는 3 라운드에서 k + 1 후보를 효과적으로 가지지 만 2 라운드 에서는 m-1 후보 만 있습니다 . 우리는 마지막 콘테스트의 우승자를 알고 있기 때문에 결과가 불확실한 m-1 개의 콘테스트 만 있으므로 g (m -1, k + 1) 가능한 결과.
승자가 2 라운드 건너 뛴 k 후보 중 하나 이면 계산이 약간 까다로워집니다. 이전과 같이 m-1 라운드 만 남았지 만 이제는 3 라운드에 k 명의 후보가 있고 2 라운드에 m 개의 후보자가 있습니다. 2 라운드 후보의 수와 3 라운드 경기의 수가 다르므로 가능한 결과는 없습니다. g 의 간단한 호출로 계산됩니다 . 그러나 첫 번째 라운드 2 후보가 옳고 그름으로 대답 한 후, 라운드 2 후보의 수는 다시 한 번 m-1 라운드 3 대회 와 일치합니다 . 후보자가 승진하면 k + 1 라운드 3 후보가 있으므로 g (m-1, k + 1)가능한 결과; 후보가 제거되면, 라운드 3 후보의 수는 k에 남아 있고 g (m-1, k)의 가능한 결과가 있습니다. 응시자는 진척 여부에 관계없이 g (m-1, k + 1) + g (m-1, k) 가능한 결과가이 두 가지 경우에 결합됩니다.
이제 대상을 수상한 모든 k + m 후보에 대한 잠재적 결과를 추가하면 결과는 g (m, k) 와 일치해야합니다 . 각각 g (m-1, k + 1)의 결과로 이어지는 m 라운드 2 명의 참가자가 있으며, g (m-1, k + 1) + g (m-1, k)로 이어지는 k 라운드 3 명의 참가자가 있습니다. 그들. 요약하면 다음과 같은 정체성을 얻습니다.
기본 케이스와 함께
이 두 공식은 함수 g를 완전히 특성화합니다 .
골프 구현
동안
g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(49 바이트, 0**m
산출 한 후에는 m이 떨어진다 0 ) 또는
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48 바이트, 1 대신 True 반환 ) 유효한 솔루션이 될 것입니다. 아직 저장할 바이트가 있습니다.
첫 번째 인수로 라운드 2 후보 의 개수 m 대신 라운드 n 후보 의 개수 n 을 취하는 함수 f 를 정의하면 , 즉
우리는 재귀 공식을 얻습니다
기본 케이스
마지막으로
그래서 파이썬 구현
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
( k/n
수율 1 회 N = K가 1) 기반 인덱싱 당면한 과제를 해결한다.