Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 01.08.2017
Сообщений: 19

Не работает рекурсивная функция

30.09.2018, 07:30. Показов 2454. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, имеется задание:

Напишите вспомогательную функцию nth, которая в качестве аргументов
принимает список и число, а возвращает элемент на
заданной позиции в списке или же undefined в случае
отсутствия такого элемента.


Мой код не работает

Подскажите в чем проблема ?

мой код:
список преставляет из себя:
JavaScript
1
2
3
4
5
6
7
8
9
10
var list = {
value: 1,
rest: {
  value: 2,
  rest: {
    value: 3,
    rest: null
        }
      }
 };
Код функции
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function nth (list, poisk , vhod){
    if (vhod == undefined){
        vhod = 0;
    }
    for(var value in list){
        if (typeof list[value] == "number" )
        {
            if (poisk == vhod)
            {
            return list[value];
            }
        }
        else if (typeof list[value] == "object")
        {
            vhod  = vhod + 1;
           nth (list[value],poisk, vhod);
        }      
    }
    return undefined;
 }
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2018, 07:30
Ответы с готовыми решениями:

Не работает рекурсивная функция
Файл "Tree.js" function changeDisplay(id){ //Функция открытия закрытия дерева var ul = document.getElementById('ul' +...

Рекурсивная функция
Здравствуйте! Нужно сделать рекурсивную функцию по этому заданию: "Дано натуральное число n. Напишите рекурсивную функцию, которая...

В VS 2015 не работает рекурсивная функция, которая работает в C++Builder
Добрый день! Перенес блок кода из старого учебного проекта под C++Builder, который там всегда стабильно работал, на VS 2015. Одна из...

10
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
30.09.2018, 13:27
Здравствуйте. Такая функция сгодится?
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <script>
        var list = {
            value: 1,
            rest: {
                value: 2,
                rest: {
                    value: 3,
                    rest: null
                }
            }
        };
 
        console.log(nth(list, 2));
 
        function nth(obj, num) {
            let tmp = obj,
                i = 0;
            while (i < num) {
                tmp = tmp.rest;
                if (!tmp)
                    break;
                ++i;
 
            }
            return i === num ? tmp.value : undefined;
        }
    </script>
</body>
</html>
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
01.10.2018, 01:38
Если правильно понял задание, то вот
JavaScript
1
2
3
4
5
6
        function nht(l, n)
        {
            if(!l)return undefined;
            if (l.value == n) return l;
            else return nht(l.rest, n);
        }
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
01.10.2018, 09:48
diadiavova, прикольно. У Вас именно рекурсивный вариант функции.
Немного окультурил не рекурсивный вариант функции:
JavaScript
1
2
3
4
5
6
        function nth(obj, num) {
            for (var i = 0; i < num && obj; ++i) {
                obj = obj.rest;
            }
            return i === num && obj ? obj.value : undefined;
        }
И опять подтверждается - если увидел while, скорее всего красивее будет переделать в for ))
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
01.10.2018, 09:54
Лучший ответ Сообщение было отмечено DisanT8 как решение

Решение

Цитата Сообщение от DisanT8 Посмотреть сообщение
Мой код не работает
Подскажите в чем проблема ?
Потому что на 16 строке надо возвращать результат выполнения рекурсивного вызова функции, иначе по стеку вызовов результат уйдёт в никуда.
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
01.10.2018, 10:19
j2FunOnly,
Цитата Сообщение от diadiavova Посмотреть сообщение
Если правильно понял задание
Цитата Сообщение от DisanT8 Посмотреть сообщение
return list[value];
Насколько понимаю в теории связных списков, value само является элементом односвязного списка. Всё остальное - служебная информация для организации односвязного списка.
То есть в теории позиция исчисляется с нуля, а value может быть "Вася".
1
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
01.10.2018, 10:29
amr-now, я отвечал на конкретный вопрос ТСа почему не работает его реализация рекурсивной функции.

А в теории мы с вами можем за ТСа допридумывать что угодно. diadiavova уже дал ответ, но у ТСа своё видение вопроса, зачем ему цикл for и проверки на тип - ну так хочется значит .
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
01.10.2018, 11:12
j2FunOnly,
DisanT8 возвращает именно value в качестве элемента списка. Но настолько замороченно!
Всем спасибо, интересная задача ))
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
01.10.2018, 11:55
Цитата Сообщение от amr-now Посмотреть сообщение
Насколько понимаю в теории связных списков, value само является элементом односвязного списка. Всё остальное - служебная информация для организации односвязного списка.
Мда, что-то я, увидев список в таком виде, как он представлен в топикстарте, не сообразил что это. ))
DisanT8, а почему не описать список в виде класса? Примерно таким образом(остальные методы тоже реализовать надо).
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        class List
        {
            constructor(array)
            {
                let fromArray = (a =>
                {
                    if (a.length > 0) this.head = a.splice(0, 1)[0];
                    this.tail = a.length > 0 ? new List(a) : null;
                }).bind(this);
                fromArray(array);
            }
 
            nht(index)
            {
                
                if (index < 0 || !Number.isInteger(index)) return undefined;
                if (index == 0) return this.head;
                else return this.tail ? this.tail.nht(index - 1) : undefined;
            }
 
        }
 
        let l = new List([6, 3, 9, 1, 2, 3, 4]);
        console.log(l.nht(3), l.nht(10)); // 1
0
1 / 1 / 0
Регистрация: 01.08.2017
Сообщений: 19
02.10.2018, 10:14  [ТС]
Нужно было выполнить задание, не используя классы)
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.10.2018, 09:24
Для полноты вариантов добавлю вариант от diadiavova, вытаскивающий value по индексу. Рекурсивный и без классов:
JavaScript
1
2
3
4
5
6
7
8
        function nth_diadiavova(l, n) {
            if (!l || isNaN(n) || n < 0)
                return undefined;
            if (n == 0)
                return l.value;
            else
                return nth_diadiavova(l.rest, n - 1);
        }
Между прочим, нерекурсивные варианты без классов в ответах #2 и #4 тоже рабочие.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2018, 09:24
Помогаю со студенческими работами здесь

Не работает рекурсивная функция
У меня есть поле 80 на 80 клеток, с препятствиями. Функция должна в отдельный массив записавыть в соответствующую клеточку число,...

Неправильно работает рекурсивная функция
Всем привет. Ребят, есть вот такая задача: Есть организация. У неё есть всякие подразделения (ID). У каждого подразделения есть баллы,...

Как работает рекурсивная функция
Есть функция вывода бинарного дерева struct Node { int x; Node *l,*r; }; void show(Node *Tree) { if (Tree!=NULL)

Объяснить как работает рекурсивная функция и стек вызовов на моем примере
Объясните пожалуйста как работает рекурсивная функция и стек вызовов на моем примере. Здесь известный алгоритм &quot;Разделяй и...

Рекурсивная функция у меня другая но только не рекурсивная
Добрый день все ! Писал я про задачку но так и не кто откликнулся напомню о чем речь &quot; Добрый день форумчане! Мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru