Функция с использованием рекурсии

#recursion #mips

#рекурсия #mips

Вопрос:

Я хочу создать программу, которая определяет время, в течение которого целые числа массива будут меньше или равны определенному числу. Я должен использовать рекурсию. Я думаю возвращать 0, когда целое число больше числа, и 1 в противном случае. Наконец, я хочу найти способ добавить все эти возвраты, снова вызвав функцию в виде рекурсии. Пожалуйста, помогите мне!

Должен ли я каждый раз сохранять возвращаемое значение ($ v0) в стеке?

Комментарии:

1. О каком языке вы говорите?

2. codymanix: MIPS — это язык ассемблера низкого уровня. Она больше не используется широко (по-моему, мой учитель сказал, что только Sony все еще использует ее в своих игровых системах Playstation).

Ответ №1:

Да, в начале каждого вызова функции вы вызываете стек и сохраняете необходимые значения, а в конце функции (эпилог) вы должны вернуть стек в исходное положение, иначе вы будете восстанавливать недопустимые переменные и данные из стека.

Мое предложение состояло бы в том, чтобы передавать адрес вашего массива байтов при каждом вызове и количество элементов в массиве и возвращать номер итерации (и непосредственно перед рекурсивным вызовом проверять итерацию > количество массива и переходить к вашему эпилогу), а также общее количество вхождений.

Быстрая мысль в моей голове подсказывает мне, что если вы правильно ее реализуете, она должна сработать. К сожалению, у меня нет времени на написание примера, подобного этому (мне скоро нужно уходить на занятия), но теория должна быть обоснованной. Я могу посмотреть ваш код и, возможно, помочь позже и / или написать краткий пример позже сегодня.

Комментарии:

1. Спасибо за предложения! Я попытаюсь применить их в своей программе и надеюсь найти решение!

Ответ №2:

Всего пара мыслей:

  1. Обычно, по соглашению, значение 0 означает false; а любое другое значение означает true. Просто чтобы избежать путаницы, вы можете захотеть принять это соглашение в своем коде. Когда вы описываете свои мысли, кажется, что истина и ложь имеют противоположные полярности по сравнению с общепринятыми.

  2. Возможно, улучшение, которое должно понравиться вашему преподавателю: вместо возврата 0 или 1 в результате сравнения целых чисел, вы могли бы рассмотреть возможность возврата арифметической разницы между двумя сравниваемыми целыми числами. Это даст вам не только равенство (т. Е. разницу == 0), но и некоторую дополнительную информацию о целых членах массива без каких-либо дополнительных затрат сложности программы или времени. Меня учили, что при прочих равных условиях чем больше информации может вернуть функция, тем лучше.

  3. Что касается рекурсии: я не думаю, что вам нужно хранить все ($ v0) s в стеке до тех пор, пока вы не забудете накапливать каждый возвращенный ($ v0) где-то в глобальной переменной. Но это только мое мнение на данный момент, без рассмотрения проблемы.

HTH. Я должен сказать, что это очень приятное, небольшое, доступное введение в рекурсию. Браво.

Комментарии:

1. Спасибо за предложения! Я попытаюсь применить их к моей программе

2. Вы хотели бы сохранить $ v0 в стеке по той единственной причине, что вы абсолютно не знаете, используется ли он где-либо еще. Меня научили сохранять КАЖДУЮ переменную в стек и удалять ее по мере необходимости для подобных задач.