Я не уверен, что это подходящее место, чтобы задать этот вопрос, но поскольку это связано с программированием и кодом, мы надеемся, что это подходящее место.
Я попытался опубликовать информацию о программистах и компьютерных науках SE, но они перенаправили меня на этот сайт.
Вопрос о том, как я могу написать код/программу машинного реестра, который вычисляет число Фибоначчи. Синтаксис кода на самом деле очень простой.
(Ниже приведены только для справки, извините за длинный пост)
(Более подробное объяснение см. В книге "Формальная логика: ее масштабы и ограничения" Ричарда Карла Джеффри)
Согласно Википедии, машина регистрации - это общий класс абстрактных машин, используемый способом, подобным машине Тьюринга. Регистр (процессор) - это небольшой объем хранилища, доступный как часть процессора или другого цифрового процессора.
Мы можем упростить задачу, моделируя регистры как пустые ведра, и мы можем позволить помещать мрамор или камни в регистр ( "ведро" ). Правило состоит в том, чтобы добавлять или удалять мрамор из ведра для выполнения вычислений.
Правила:
1. Регистрационная машина использует конечное число ведер и бесконечную поставку мрамора.
2. Каждое ведро можно идентифицировать индивидуально. Мрамор не нужно различать.
3. Программа машинного регистра - это конечный набор инструкций:
- добавить мрамор в ведро (а затем перейти к следующей инструкции).
- Или взять мрамор из ведра (и перейти к следующему
если вы можете, или другое, если вы не можете).
4. Программа может быть записана в блок-схеме или в списке инструкций.
Вот пример программы машинного регистра, который выполняет добавление.
Пусть A, B, C - ведра.
1. (-B; 2,4) означает отнять один мрамор из ведра B, перейти к инструкции 2, если может, или 4, если не может
2. (+ A; 3) означает добавить один мрамор в ведро A, затем перейти к инструкции 3
3. (+ C; 1) означает добавление одного мрамора в ведро C, затем перейдите к инструкции 1
4. (-C; 5, -) означает отнять один мрамор из ведра C, перейти к инструкции 2, если может, или выйти, если не может
5. (+ B; 4) означает добавить один мрамор в ведро B, затем перейти к инструкции 4
Нетрудно показать, что предположим, что мы имеем 3 мрамора в ковше A и 2 мрамора в ковше B и 4 мрамора в ковше C. После выполнения этого алгоритма будет | A | + | B | = 3 + 2 = 5 мраморов в ковше A и | B | + | C | = 2 + 4 = 6 мрамора в ковше B.
(Я надеюсь, что приведенный выше пример достаточно ясен для иллюстрации)
(Теперь вот вопрос)
Теперь я хотел бы написать машинный код регистра, который при задании ввода n в ведро A возвращает (также в ковше A) n-й номер Фибоначчи. Числа Фибоначчи равны 0 (0-й), 1 (1-й), 1 = 0 + 1 (второй) и т.д. Мы можем использовать любое количество ковшей, цель состоит в том, чтобы написать код как можно более простым (т.е. с наименьшее количество инструкций). Рекуррентное соотношение Фибоначчи есть F (n) = F (n-1) + F (n-2), если F (0) = 0 и F (1) = 1.
Вот моя попытка и код:
Моя идея состоит в том, чтобы использовать ведро A в качестве входного сигнала и, наконец, как выход F (n) (поскольку вопрос требует вывода в ковше A), ведро B в качестве "счетчика", ведро C в качестве F (n-1) и ведро D как F (n-2).
1. (+ C; 2)
2. (-A; 3,4)
3. (+ B; 2)
4. (-D; 5,7)
5. (+ A; 4)
6. (-C; 5,7)
7. (-B; 6, -)
Но мой код работает только до n = 2, я изо всех сил стараюсь, чтобы код работал для любого n > 2.
Я думал за эти дни и ночи, я был бы признателен, если бы кто-нибудь мог мне помочь в этом. Пожалуйста, не стесняйтесь спрашивать меня о разъяснении, если что-то неясно.
Большое спасибо заранее!