Нет, они не эквивалентны. let
и where
вводят совместное использование , что означает, что значение оценивается только один раз. Компилятор, как правило, не поделится результатом двух идентичных выражений, если вы сами не скажете ему об этом, потому что он, как правило, не может сам по себе сказать, выгоден ли компромисс между пространственно-временными действиями или нет.
Таким образом, ваша первая программа будет делать два рекурсивных вызова за одну итерацию, делая ее O (2 ^ n) , в то время как вторая делает только один на одну итерацию, то есть O (n) . Разница между ними огромна. При n = 25 первая программа приводит к более чем 33 миллионам рекурсивных вызовов, а вторая - только 25.
Итак, мораль этой истории в том, что если вы хотите поделиться, вы должны попросить об этом, используя let
или where
.