Рекурсия в JS

12
D
На сайте с 28.06.2008
Offline
997
162

Есть задачка

Дано число. Сложите его цифры. Если сумма получилась более 9-ти, опять сложите его цифры. И так, пока сумма не станет однозначным числом (9 и менее).

подумал, написал так

    "use strict";

function overNine(num) {
    let sum = 0;
        let arr = String(num).split('');
        for (let i=0;i<arr.length;i++){
            sum += Number(arr[i]);
        }

    console.log(sum);//почему тут я получаю 41, а затем 5
        if (sum>9){
            overNine(sum)
        }else {
           console.log(sum);//а тут тут я получаю 5, и undefined (я ожидал только 5 и все)
            return sum
        }
   
}
    console.log(overNine(2246465462))

Вопрос, почему значение 5 не возвращается? Откуда там undefined?

Aisamiery
На сайте с 12.04.2015
Offline
216
#1
Dram :

Вопрос, почему значение 5 не возвращается? Откуда там undefined?

undefined вы получаете тут

console.log(overNine(2246465462))

потому что ничего ( undefined) не возвращаете тут

if (sum>9){
    overNine(sum)
}

рекурсия должна возвращать либо значение либо запуск самой себя с новым значением (не знаю как правильно написать)

        if (sum>9){
            return overNine(sum) // нужен return
        } else {
            return sum
        }

иначе вы не вернете значение из глубины (когда оказалось 41)

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
ArbNet
На сайте с 27.10.2019
Offline
77
#2
Учитесь писать лаконичный код
function moreNine(num){
    while(num>9){
        let str=String(num);num=0;
        for(let nx=0;nx<str.length;nx++)
            num+=Number(str[nx]);
    }
    return num
}
console.log(moreNine(2246465462))
Блажен, кто не стремится сделать лучше: он не рискует быть не понятым.
D
На сайте с 28.06.2008
Offline
997
#3
Aisamiery  спасибо!
S3
На сайте с 29.03.2012
Offline
235
#4
ArbNet #:
Учитесь писать лаконичный код

Это не рекурсия

ArbNet
На сайте с 27.10.2019
Offline
77
#5
Sly32 #:

Это не рекурсия

Знаю. В данном случае она и не нужна. Рекурсию надо применять только для формирования вложенных данных ,например: меню в котором есть подменю, категории и тп.

S3
На сайте с 29.03.2012
Offline
235
#6
ArbNet #:

Знаю. В данном случае она и не нужна. Рекурсию надо применять только для формирования вложенных данных ,например: меню в котором есть подменю, категории и тп.

Человек изучает рекурсию. Зачем писать о чем то что вообще не имеет отношения к теме. Есть задача написать рекурсивный вывод, знаешь как- пиши или не позорься. 

O
На сайте с 30.09.2019
Offline
18
#7

Через др. место, но рекурсия )

_num = 2246465462;
setTimeout(function run() {
        let str = String(_num);
        num = 0;
        for (let i = 0; i < str.length; i++) {
                num += Number(str[i]);
        }
        if (num > 9){
                _num = num;
                setTimeout(run, 0);
     } else {
                alert(num);
        }
});
ArbNet
На сайте с 27.10.2019
Offline
77
#8
Sly32 #:

Человек изучает рекурсию. Зачем писать о чем то что вообще не имеет отношения к теме. Есть задача написать рекурсивный вывод, знаешь как- пиши или не позорься. 

Это вы сейчас позоритесь..

Вы, это я имею виду тебя и тех кто так учат новичков. Потому что надо учить на правильных примерах, именно для чего нужно использовать рекурсию, а не через одно место.. когда она и не нужна.

Потом такие вот "спецы" пишут дебильный код, потому что учителя сами такие.. не понимают для чего, зачем и как надо делать правильно..

Вот хороший пример рекурсии:

// Сортировка по расширению
function Recurs(res,arr){
    for(let key in arr){
        if(arr[key] instanceof Array)
            Recurs(res,arr[key]);
        else{
            let val=arr[key].split('.');
            if(!(res[val[1]] instanceof Array))res[val[1]]=[];
            res[val[1]].push(val[0]);
        }
    }
    return res
}

// тест функции рекурсии
let arr=[
    'aaa.xx',
    [
        'b10.xx',
        [
            'b21.zz',
            'b22.xx'
        ],
        'b30.zz',
    ],
    'ccc.zz'
]
let res=[];
Recurs(res,arr);
for(let key in res)
    console.log('С расширением '+key+' = '+res[key].join())
Aisamiery
На сайте с 12.04.2015
Offline
216
#9
ArbNet #:
Потому что надо учить на правильных примерах, именно для чего нужно использовать рекурсию, а не через одно место.. когда она и не нужна.

Вы себе льстите, когда человек спрашивает что то конкретное, надо отвечать на его конкретный вопрос, а вопрос был в следующем:

Dram :
Вопрос, почему значение 5 не возвращается? Откуда там undefined?

И не один из ваших потугов в данной теме на этот вопрос не отвечает, когда вас спросят как решить задачу тогда и будете втирать, а на текущий момент человека интересовала даже не рекурсия, а почему оно так работает

ArbNet
На сайте с 27.10.2019
Offline
77
#10
Aisamiery #:
И не один из ваших потугов в данной теме на этот вопрос не отвечает, когда вас спросят как решить задачу тогда и будете втирать, а на текущий момент человека интересовала даже не рекурсия, а почему оно так работает

Если человек делает не правильно, то ему лучше об этом сказать, вместо того чтобы помогать дальше делать не правильно.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий