Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Странное поведение рекурсии (https://javascript.ru/forum/study/66459-strannoe-povedenie-rekursii.html)

rexrjd 16.12.2016 03:32

Странное поведение рекурсии
 
День добрый, следующая функция должна умножать цифры в числе num, если после перемножения цифр число все еще содержит более одной цифры, повторять действие. Переменная res должна показывать сколько раз функция вызывала сама себя. Не могли бы вы пояснить почему переменная res уменьшается после первого самовызова функции.
function persistence(num,res) {
	var N = String(num);
	var sum = 1;
	for(var i = 0; i<N.length; i++){
	sum = sum * Number(N.charAt(i));
	if(String(sum).length != 1)
	{

		res++;
			
		persistence(sum,res);
	}
	}	
console.log(res);
return res;
}
a = persistence(39,0);

ksa 16.12.2016 08:19

Цитата:

Сообщение от rexrjd
Не могли бы вы пояснить почему переменная res уменьшается после первого самовызова функции.

Вот тебе более наглядная иллюстрация

function persistence(num,res) {
	var N = String(num);
	var sum = 1;
	alert('start '+N);
	for(var i = 0; i<N.length; i++){
		sum = sum * Number(N.charAt(i));
		if(String(sum).length != 1)	{
			res++;
			alert('for '+res);
			persistence(sum,res);
		}
	}	
	alert('return '+res+' num= '+num);
	return res;
}
a = persistence(39,0);

Она не "уменьшается", она именно этому равна в самой первой итерации.

Если ты хочешь иметь некий счетчик, то это делается не так. :no:

ksa 16.12.2016 08:28

rexrjd, как вариант...

function persistence(num,res) {
	var N = String(num);
	var sum = 1;
	alert(++res+'. start '+N);
	for(var i = 0; i<N.length; i++) {
		sum = sum * Number(N.charAt(i));
	};
	if (String(sum).length != 1) {
		res=persistence(sum,res);
	};
	return res;
};
a = persistence(39,0);
alert(a);


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