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

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

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


person zoe    schedule 07.04.2011    source источник
comment
О каком языке вы говорите?   -  person codymanix    schedule 07.04.2011
comment
codymanix: MIPS — это язык ассемблера низкого уровня. Он больше не используется широко (кажется, мой учитель сказал, что только Sony все еще использует его в своих игровых системах Playstation).   -  person Jeremy Dentel    schedule 07.04.2011


Ответы (2)


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

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

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

person Jeremy Dentel    schedule 07.04.2011
comment
Спасибо за предложения! Я постараюсь применить их в своей программе и надеюсь найти решение! - person zoe; 07.04.2011

Просто пара мыслей:

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

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

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

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

person Pete Wilson    schedule 07.04.2011
comment
Спасибо за предложения! Я постараюсь применить их к своей программе - person zoe; 07.04.2011
comment
Вы хотели бы хранить $v0 в стеке по той единственной причине, что вы не знаете, используется ли он где-то еще. Меня учили хранить КАЖДУЮ переменную в стеке и удалять ее по мере необходимости для таких вещей. - person Jeremy Dentel; 08.04.2011