Сначала напишем две простые функции:
mult
- кратно a
и b
const mult = (a, b) => a * b;
mult(3, 4);
//=> 12
prod
- умножает вместе все элементы списка.
const prod = (...ns) => ns.reduce(mult);
prod(1, 2, 3, 4);
//=> 24
Как мы можем разбить число (мы предполагаем положительное целое число) на его цифры?
то есть от 123
до [1, 2, 3]
. Есть много способов сделать это. Для этого ответа я просто буду использовать:
const to_digits = n => Array.from(String(n), Number);
to_digits(123);
//=> [1, 2, 3]
Теперь давайте проведем рефакторинг вашей функции (я назвал ее prod_digits
):
const prod_digits =
n =>
Math.abs(n) < 10 ? n
: n < 0 ? prod_digits(prod(-1, ...to_digits(Math.abs(n))))
: prod_digits(prod(...to_digits(n)));
console.log(prod_digits(66)); //=> 8
console.log(prod_digits(-66)); //=> -8
console.log(prod_digits(6)); //=> 6
console.log(prod_digits(-6)); //=> -6
<script>
const to_digits = n => Array.from(String(n), Number);
const mult = (a, b) => a * b;
const prod = (...n) => n.reduce(mult);
</script>
Оптимизация (и)
В качестве упражнения вы можете реализовать два условия раннего выхода:
- Если
to_digits
возвращает список, содержащий 0
, просто возвращает 0
- Если
to_digits
возвращает список, состоящий только из 1
, просто возвращает 1