Created
October 29, 2018 01:10
-
-
Save lpestl/060c7c110ab85e7de300fa76a8da9858 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Learn more about F# at http://fsharp.org | |
// See the 'F# Tutorial' project for more help. | |
// Функция подсчета всех возможных вариантов пирамид | |
let CountPosiblePiramids N = | |
// Рекурсивная функция с параметрами ОСТАТОК блоков, максимальная длинна текщего слоя из блоков и количество возможных пирамид | |
let rec CalcTopLayer remainder maxLenght count = | |
// Счетсик делаем изменяемым | |
let mutable currCount = count | |
// Если остаток и максимальная длинна корректны | |
if remainder >= 0 && maxLenght >= 0 then | |
// то проверим остаток блоков | |
if remainder = 0 then | |
// если все израсходованы - то пирамида готова | |
currCount <- currCount + 1 | |
// иначе | |
else | |
// попробуем собрать следующий слой | |
if remainder - maxLenght >= 0 then | |
// с учетом того, что остаток уменьшится на количество блоков в текщем слое, | |
// а следующий слой будет минимально на единицу меньще текущего | |
currCount <- CalcTopLayer (remainder-maxLenght) (maxLenght - 1) currCount | |
// Если максимальная длинна слоя может быть уменьшена | |
if maxLenght - 1 > 0 then | |
// то уменьшим его и посчитаем все варианты пирамид для такого случая | |
currCount <- CalcTopLayer remainder (maxLenght-1) currCount | |
// И вернем подсчитанное количество возможных пирамид | |
currCount | |
// Запуск рекурсии и ответ - количество возможных вариантов | |
CalcTopLayer N N 0 | |
[<EntryPoint>] | |
let main argv = | |
// Tests from task | |
printfn "N = %A; Answer = %A" 3 (CountPosiblePiramids 3) | |
printfn "N = %A; Answer = %A" 5 (CountPosiblePiramids 5) | |
printfn "N = %A; Answer = %A" 6 (CountPosiblePiramids 6) | |
// Other tests | |
printfn "N = %A; Answer = %A" 7 (CountPosiblePiramids 7) | |
printfn "N = %A; Answer = %A" 8 (CountPosiblePiramids 8) | |
printfn "N = %A; Answer = %A" 9 (CountPosiblePiramids 9) | |
printfn "N = %A; Answer = %A" 10 (CountPosiblePiramids 10) | |
printfn "N = %A; Answer = %A" 20 (CountPosiblePiramids 20) | |
printfn "N = %A; Answer = %A" 30 (CountPosiblePiramids 30) | |
printfn "N = %A; Answer = %A" 40 (CountPosiblePiramids 40) | |
printfn "N = %A; Answer = %A" 50 (CountPosiblePiramids 50) | |
printfn "N = %A; Answer = %A" 60 (CountPosiblePiramids 60) | |
printfn "N = %A; Answer = %A" 70 (CountPosiblePiramids 70) | |
printfn "N = %A; Answer = %A" 80 (CountPosiblePiramids 80) | |
printfn "N = %A; Answer = %A" 90 (CountPosiblePiramids 90) | |
printfn "N = %A; Answer = %A" 100 (CountPosiblePiramids 100) | |
// Tests from chat | |
printfn "N = %A; Answer = %A" 42 (CountPosiblePiramids 42) | |
0 // return an integer exit code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment