Как найти наименьший делитель числа javascript

Прохожу уроки на Hexlet и столкнулся с темой «итеративный процесс«.
Думаю, что в моем коде (см. ниже) не хватает ещё нескольких условий (инструкций) для его грамотного выполнения.

Не прошу выполнить всё за меня, но прошу дать наводку или объяснить, чего не хватает. ГОТОВЫЙ КОД МНЕ НЕ НУЖЕН!

const nod = (num) => {
  const iter = (delitel, acc) => {
    if (delitel === 1) {
      return acc
    }
    return iter(delitel - 1, acc % delitel)
  }
  return iter(5, num)
}
console.log(nod(15));

задан 28 янв 2019 в 10:42

Omar T.'s user avatar

15

const nd = (num, div = 1) => num % ++div ? nd(num, div) : div;

console.log(nd(15));

ответ дан 28 янв 2019 в 12:45

Vadzim Liashkevich's user avatar

С помощью рекурсии это можно сделать так

const node = (num) => {
  const iter = (divider = 2) => {
    if (divider * divider > num) {
      return num;
    }
    if (num % divider) {
      return iter(divider + 1);
    }
    return divider;
  }
  return iter();
}
console.log(node(15));

ответ дан 28 янв 2019 в 12:03

Vladimir's user avatar

VladimirVladimir

1,6977 серебряных знаков6 бронзовых знаков

1

Как я помню из SICP итеративный процесс это рекурсия в которой рекурсивный вызов — последнее действие в функции. Это ещё называется хвостовая рекурсия.

Тогда задачу можно решить например так:

const least_divisor = n => {
    const iter = d => {
        if (n % d === 0) {
            return d;
        }
        return iter(d + 1);
    }
    return iter(2);
};

Хвостовая рекурсия в функции с говорящим названием iter.

Или можно перебирать делители с другого конца. Выглядит странно, но работает:

const least_divisor = n => {
    const iter = (d, least_d) => {
        if (d === 1) {
            return least_d;
        }
        if (n % d === 0) {
            least_d = d;
        }
        return iter(d - 1, least_d);
    }
    return iter(n - 1, n);
};

ответ дан 27 мая 2021 в 22:49

Stanislav Volodarskiy's user avatar

const smallestDivisor = (num) => {
  if (num % 2 === 0 && num > 0) {
    return 2;
  } else if (num <= 0) {
    return NaN;
  } else if (num === 1) {
    return num;
  }
  // Проверки на корректный ввод данных для значения "num"
  const devider = (count = 2) => {
    /* Если "Num" делится на значение "devider" с остатком 
       (остаток от деления не равен 0,  к значению делителя 
       прибовляем (+1) */
    if (num % count !== 0) {
      return devider(count + 1);
    } else {
      /* Дефолтное значение (если остаток от деления равен 0, 
         count остается прежним) */
      return count;
    }
  }
  return devider();
}

0xdb's user avatar

0xdb

51.4k194 золотых знака56 серебряных знаков232 бронзовых знака

ответ дан 25 янв 2022 в 15:02

Евгений Колмак's user avatar

Евгений КолмакЕвгений Колмак

4732 золотых знака3 серебряных знака13 бронзовых знаков

1


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

Show hidden characters

// BEGIN (write your solution here)
const smallestDivisor = num => {
let divisor = 2;
if(num < 1) {
return NaN;
}
if(num === 1) {
return num;
}
while (num % divisor) {
divisor++;
}
return divisor;
};
// END
export default smallestDivisor;
solution.js
Напишите функцию smallestDivisor. Она должна находить наименьший целый делитель числа. Поведение у функции должно быть таким же, как в предыдущем уроке, но реализация — код функции — должно быть другим. На этот раз реализуйте императивный итеративный процесс, что означает:
не используйте рекурсию
используйте переменные
используйте цикл while
Например, наименьший делитель числа 15 это 3.
smallestDivisor(15); // 3
smallestDivisor(17); // 17
smallestDivisor(0); // NaN
smallestDivisor(-3); // NaN
Замечание: Если переданное в smallestDivisor число меньше единицы, возвращайте NaN.
Идея алгоритма:
Попробуйте разделить число на 2.
Если число делится без остатка, то это наименьший делитель.
Если нет, то попробуйте следующий делитель.
Если ничего не делит число без остатка, то переданное число является простым, так что его наименьший делитель — оно само (не считая 1)
Подсказка
Вспомните про оператор % (modulus or остаток от деления) из урока 4. Он вычисляет остаток от деления одного операнда на другой. Например, 11%5 это 1, а 10%2 это 0.
Так что если x%y это 0, то y делит x без остатка.

Cliffheath

Как находить наименьший делитель в итеративном процессе рекурсии?

Прохожу курс основ программирования на Хекслете.
В задачке по итеративному процессу, где надо найти наименьший делитель заданного числа случился хардстак. Вот мой код:

const smallestDivisor = (num) => {
const iter = (counter, acc) => {
    if (counter === 1) {
        return 1;
}
    if (counter % acc) {
        return acc;
    }
    return iter(counter, acc + 1);
};
    return iter(num, 4);
};

Пытаюсь найти наименьший делитель для числа 4, который является 2кой.
Спойлерить решение от Хекслета не хочу, хочу понять как решать.


  • Вопрос задан

    более трёх лет назад

  • 2428 просмотров

Пригласить эксперта

Читайте задание внимательнее.
Попробуйте в голове разложить алгоритм простыми словами.

1. Передаем в функцию число num (например, 9)
2. Создаем переменную acc с начальным значением 2 (1 нам не нужно)
3. Делим num на acc.
4. Делиться без остатка? (9 % 2) Это наименьший делитель, возвращаем его.
5. Не делиться? Добавляем к acc +1 и пробуем еще раз.
6. Дошли до acc = num? Возвращаем num.

Соответственно, с пункта 2 по 6 — это рекурсия, которая работает с acc.


  • Показать ещё
    Загружается…

28 мая 2023, в 08:16

5000 руб./за проект

28 мая 2023, в 07:29

1500 руб./за проект

28 мая 2023, в 02:05

7000 руб./за проект

Минуточку внимания

Студворк — интернет-сервис помощи студентам

Всем привет!
Есть задачка по нахождению наименьшего делителя, при этом нужно использовать императивный итеративный процесс, т.е. как я понимаю:
— не использовать рекурсию
— использовать переменные
— использовать цикл while

Решил я таким образом:
———————————————

Javascript
1
2
3
4
5
6
7
8
9
const smallestDivisor = ( num ) => {
  if ( num === 1 ) { return num; }
  else if (num < 1) { return NaN; }
  let dell = 2;
  while ( num % dell === 1 ) {
   dell = dell + 1;
   }
  return dell;
};

———————————————
Дело в том, что при прохождении тестов ошибка, если подать на вход 121 — на выходе 7 и программа завершается.. не понимаю почему?

Если же изменить решение на такое:
——————————————-

Javascript
1
2
3
4
5
6
7
8
9
const smallestDivisor = ( num ) => {
  if ( num === 1 ) { return num; }
  else if (num < 1) { return NaN; }
  let dell = 2;
  while ( num % dell !== 0 ) {
   dell = dell + 1;
   }
  return dell;
};

——————————————-
Все отлично. НО! я не понимаю в чем принципиальное отличие и почему в первом варианте fail..

P.S. Как понимаете в этом я совсем новичок, так что сильно не пинайте и по возможности объясните проще)))
Спасибо за помощь)!

Старый

22.05.2017, 18:50

Интересующийся

Отправить личное сообщение для Alexsandr

Посмотреть профиль

Найти все сообщения от Alexsandr

 

Регистрация: 22.05.2017

Сообщений: 25

функция нахождения наименьшего делителя числа итеративный процесс

const smallestDivisor = (num) => {
const denominator = 2;
const result = (num, denominator) => {
  return (num % denominator);
}
if (result === 0) {
return denominator;
} 
 *!*result(num, denominator+1);*/!*
};

smallestDivisor(100);

Суть программа для нахождения наименьшего делителя числа, работает просто прибавляет к делителю 1 и смотрит если делит без остатка то все ок и возвращает делитель
Но не работает в 9 строчке возвращает undefined

Ответить с цитированием

Старый

22.05.2017, 19:14

Интересующийся

Отправить личное сообщение для Alexsandr

Посмотреть профиль

Найти все сообщения от Alexsandr

 

Регистрация: 22.05.2017

Сообщений: 25

Нет меня интересовало почему в моем коде происходит undefined
Мне не нужно решение мне нужно понять почему происходит ошибка

Ответить с цитированием

Старый

22.05.2017, 19:38

Аватар для MallSerg

Профессор

Отправить личное сообщение для MallSerg

Посмотреть профиль

Найти все сообщения от MallSerg

 

Регистрация: 07.03.2011

Сообщений: 1,105

Сообщение от Alexsandr
Посмотреть сообщение

Нет меня интересовало почему в моем коде происходит undefined
Мне не нужно решение мне нужно понять почему происходит ошибка

Функция это не цыкл в котором есть условие завершение итераций. (ваш К.О.)
По этому функция вызывается один раз. (ваш К.О.)
Условие где стоит return не выполнятся по этому результат выражения == undefined (ваш К.О.)

Ответить с цитированием

Старый

22.05.2017, 19:54

Интересующийся

Отправить личное сообщение для Alexsandr

Посмотреть профиль

Найти все сообщения от Alexsandr

 

Регистрация: 22.05.2017

Сообщений: 25

Сообщение от MallSerg

Условие где стоит return не выполнятся по этому результат выражения == undefined (

if (result === 0) в смысле? result она считает за функцию? А не результат вычисления num % denominator ?
допустим if не выполняется но есть же всегда другая ветка result(num, denominator+1);

Ответить с цитированием

Старый

23.05.2017, 11:25

Интересующийся

Отправить личное сообщение для Alexsandr

Посмотреть профиль

Найти все сообщения от Alexsandr

 

Регистрация: 22.05.2017

Сообщений: 25

1	const smallestDivisor = (num) => {
2	  // BEGIN (write your solution here)
3	const denominator = 2;
4	const result = (num, denominator) => {
5	   return(num%denominator);
6	}
7	result(num, denominator);
8	if (result === 0) {
9	return denominator;
10	} else if (denominator === 10)
11	{
12	return 1;
13	} else {
14	return result(num, denominator+1);
15	}  // END
16	};
17	
18	smallestDivisor(10);

В седьмой строке вычисляется значение функции-константы result
В восьмой строке сравнивается значение result c 0
Проблема в том что ничего не происходит, программа идет дальше вниз хотя условие должно выполняться
Почему так ведь result это функция и когда она вычисляется то уже константа, или в условии выполняется функция? if (result === 0)

Ответить с цитированием

Старый

23.05.2017, 11:45

Аватар для ruslan_mart

Профессор

Отправить личное сообщение для ruslan_mart

Посмотреть профиль

Найти все сообщения от ruslan_mart

 

Регистрация: 30.04.2012

Сообщений: 2,932

Alexsandr, так Вы пытаетесь саму функцию сравнить с нулём, а не результат её выполнения.

const smallestDivisor = (num) => {
const denominator = 2;
const result = (num, denominator) => {
  return (num % denominator);
}
if (result(num, denominator) === 0) {
return denominator;
} 
 return result(num, denominator+1);
};

smallestDivisor(100);

Ответить с цитированием

Старый

23.05.2017, 12:42

Интересующийся

Отправить личное сообщение для Alexsandr

Посмотреть профиль

Найти все сообщения от Alexsandr

 

Регистрация: 22.05.2017

Сообщений: 25

Сообщение от Ruslan_xDD

Вы пытаетесь саму функцию сравнить с нулём, а не результат её выполнения.

А как сделать чтоб сравнить результат? В описании функции я же писал вернуть значение вычисленного return (num % denominator);

Ответить с цитированием

Понравилась статья? Поделить с друзьями:
  • Как найти телефонные номера в гугл аккаунте
  • Как найти процент ошибки
  • Как составить диалог на тему розыгрыш
  • Grim dawn как найти кузнеца
  • Как найти внешнюю память на андроиде