#recursion #mips
#рекурсия #mips
Вопрос:
Я хочу создать программу, которая определяет время, в течение которого целые числа массива будут меньше или равны определенному числу. Я должен использовать рекурсию. Я думаю возвращать 0, когда целое число больше числа, и 1 в противном случае. Наконец, я хочу найти способ добавить все эти возвраты, снова вызвав функцию в виде рекурсии. Пожалуйста, помогите мне!
Должен ли я каждый раз сохранять возвращаемое значение ($ v0) в стеке?
Комментарии:
1. О каком языке вы говорите?
2. codymanix: MIPS — это язык ассемблера низкого уровня. Она больше не используется широко (по-моему, мой учитель сказал, что только Sony все еще использует ее в своих игровых системах Playstation).
Ответ №1:
Да, в начале каждого вызова функции вы вызываете стек и сохраняете необходимые значения, а в конце функции (эпилог) вы должны вернуть стек в исходное положение, иначе вы будете восстанавливать недопустимые переменные и данные из стека.
Мое предложение состояло бы в том, чтобы передавать адрес вашего массива байтов при каждом вызове и количество элементов в массиве и возвращать номер итерации (и непосредственно перед рекурсивным вызовом проверять итерацию > количество массива и переходить к вашему эпилогу), а также общее количество вхождений.
Быстрая мысль в моей голове подсказывает мне, что если вы правильно ее реализуете, она должна сработать. К сожалению, у меня нет времени на написание примера, подобного этому (мне скоро нужно уходить на занятия), но теория должна быть обоснованной. Я могу посмотреть ваш код и, возможно, помочь позже и / или написать краткий пример позже сегодня.
Комментарии:
1. Спасибо за предложения! Я попытаюсь применить их в своей программе и надеюсь найти решение!
Ответ №2:
Всего пара мыслей:
-
Обычно, по соглашению, значение 0 означает false; а любое другое значение означает true. Просто чтобы избежать путаницы, вы можете захотеть принять это соглашение в своем коде. Когда вы описываете свои мысли, кажется, что истина и ложь имеют противоположные полярности по сравнению с общепринятыми.
-
Возможно, улучшение, которое должно понравиться вашему преподавателю: вместо возврата 0 или 1 в результате сравнения целых чисел, вы могли бы рассмотреть возможность возврата арифметической разницы между двумя сравниваемыми целыми числами. Это даст вам не только равенство (т. Е. разницу == 0), но и некоторую дополнительную информацию о целых членах массива без каких-либо дополнительных затрат сложности программы или времени. Меня учили, что при прочих равных условиях чем больше информации может вернуть функция, тем лучше.
-
Что касается рекурсии: я не думаю, что вам нужно хранить все ($ v0) s в стеке до тех пор, пока вы не забудете накапливать каждый возвращенный ($ v0) где-то в глобальной переменной. Но это только мое мнение на данный момент, без рассмотрения проблемы.
HTH. Я должен сказать, что это очень приятное, небольшое, доступное введение в рекурсию. Браво.
Комментарии:
1. Спасибо за предложения! Я попытаюсь применить их к моей программе
2. Вы хотели бы сохранить $ v0 в стеке по той единственной причине, что вы абсолютно не знаете, используется ли он где-либо еще. Меня научили сохранять КАЖДУЮ переменную в стек и удалять ее по мере необходимости для подобных задач.