Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   функция нахождения наименьшего делителя числа итеративный процесс (https://javascript.ru/forum/misc/68991-funkciya-nakhozhdeniya-naimenshego-delitelya-chisla-iterativnyjj-process.html)

Alexsandr 22.05.2017 18:50

функция нахождения наименьшего делителя числа итеративный процесс
 
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

ruslan_mart 22.05.2017 19:05

const smallestDivisor = num => {
	let d = 2;
	while(num % d++) {}
	return d;
};

smallestDivisor(100);


Оно?

Alexsandr 22.05.2017 19:14

Цитата:

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

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

MallSerg 22.05.2017 19:38

Цитата:

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

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

Alexsandr 22.05.2017 19:54

Цитата:

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

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

ruslan_mart 22.05.2017 20:08

Alexsandr, return перед вызовом не стоит.

nerv_ 22.05.2017 23:07

https://github.com/nervgh/yum.js/blo...src/yum.js#L90

Alexsandr 23.05.2017 11: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)

ruslan_mart 23.05.2017 11:45

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);

Alexsandr 23.05.2017 12:42

Цитата:

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

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

ruslan_mart 23.05.2017 12:52

Цитата:

Сообщение от Alexsandr
А как сделать чтоб сравнить результат?

Вызвать её с помощью круглых скобок и передать параметры.

if (result(num, denominator) === 0) {

}

Alexsandr 29.05.2017 14:07

const smallestDivisor = (num) => {
  // BEGIN (write your solution here)
const denominator = 2;  
const resultFinish = (num, denominator) => {
const result = (num, denominator) => {
   return(num%denominator);
}

if (result(num, denominator) === 0) {
return denominator;
} else if (denominator === 10)
{
return 1;
} else {
return resultFinish(num, denominator+1);
}}  // END
};


Первая ошибка была в том что пытался сравнивать функцию с нулем > if (result === 0) результатом было что он интерпретатор пропускал это условие, сам же думал что const result = (num, denominator) => { return(num%denominator); достаточно просто указать как переменную в условии, но на деле вышло что недостаточно указать функцию нужно дать ей аргументы чтоб она вычислила значение,
чтобы рекурсия замкнулась я создал функцию resultFinish которая включает result и условия if что бы оценить результат и прекратить рекурсию, но что то идет не так

Alexsandr 02.06.2017 14:46

const smallestDivisor = (num) => {
      const iter = (counter, num) => { // counter это делитель, начинает с числа 2 и дальше +1 
    if ((num % counter) === 0) {// проверяет если делиться без остатка то возвращает делитель
      return counter;
      } else if (counter === 10) {// если так и не поделилось а мы перебрали все делители до 10 то дальше делить не имеет смысла и это число делиться только на себя возвращаем само число
        return num;
      } else {// в остальных случаях делаем все по новой но прибавляем к делителю +1
     iter(counter+1, num);
      }
  }
  return iter(2, num);
};

https://goo.gl/05Bxj7 ссылка на работу функции

Не знаю почему так сначала функция iter(2, 11);
вычисляет добавляя +1
iter( 3, 11);
iter( 4, 11);
iter( 5, 11);
iter( 6, 11);
iter( 7, 11);
iter( 8, 11);
ter( 9, 11);
iter( 10, 11);
return num; потому как мы перебрали все делители до 10 и дальше не имеет смысла, значит наименьший делитель само число
Но тут происходит странное
Return value 11
Return value undefined и все складывается обратно со значением Return value undefined Почему так?

Diphenyl Oxalate 02.06.2017 15:09

Цитата:

если так и не поделилось а мы перебрали все делители до 10 то дальше делить не имеет смысла и это число делиться только на себя возвращаем само число
С чего это? Например, число 169 делится только на 13, так что надо перебирать не до 10, а до Math.sqrt(n)

Diphenyl Oxalate 02.06.2017 15:17

let getSmallestDivisor = (n, i = 2) => n % i === 0 ? i : i > Math.sqrt(n) ? 1 : getSmallestDivisor(n, i + 1);

alert([
  getSmallestDivisor(167),
  getSmallestDivisor(168),
  getSmallestDivisor(169)
]);

Alexsandr 02.06.2017 15:44

Это понятно, но почему при 11 функция iter дает результат как undefined ?

Alexsandr 02.06.2017 17:06

let getSmallestDivisor = (n, i = 2) => n % i === 0 ? i : i > Math.sqrt(n) ? 1 : getSmallestDivisor(n, i + 1

что за операторы "?"

Diphenyl Oxalate 02.06.2017 19:16

Alexsandr,
в 8 строчке поставить return iter(counter+1, num);

Alexsandr 03.06.2017 03:12

Скажите пожалуйста почему в шестой строчке 06 return num;
Сразу не прерывает выполнение функции и не отдает результат? Почему потом идет зацикливание на восьмой строчке 08 iter(counter+1, num);
Ведь команда return сразу должна прерывать выполнение и выдавать результат?


Часовой пояс GMT +3, время: 00:18.