В своих заметках (из конца 90-х!) я нашел простую программу на TI-Basic, которая принимает целое число N и выводит наименьшее простое число, большее или равное N.
Prompt N
If (N/2) = int (N/2)
1+N -> N
For (I, 3, 2+iPart(√N, 2)
If (N/I) = iPart(N/I)
Then
2+N -> N
1 -> I
End
End
Disp
Stop
В строках 7 и 8 автор программы (может быть я, не помню!) переназначает переменные I и N. Это происходит в цикле For. Хочу поинтересоваться, как работает "переназначение переменных в цикле" в языке TI-Basic или автор допустил баг, допустил ошибку или вообще продемонстрировал плохой стиль программирования.
Позвольте мне описать программу, как я ее понимаю:
- запросить ввод N, предположим, int
- если N четное, обновить N до следующего нечетного
- цикл For: объявите переменную I, которая будет потенциальным делителем N. I начинается со значения 3, так как мы знаем, что N нечетно. I должен быть увеличен на 2 с (то есть 3, 5, 7,..., 2+int(√N)).
- тело цикла For представляет собой одиночное выражение If-Then-End. Логика вроде бы работает: если I является делителем N, то N не простое число и текущее значение N должно быть увеличено до следующего нечетного числа, иначе продолжить. Но в этом и заключается источник моего недоумения: почему переназначение 1 -> Я? Я думаю, что конструкция цикла For позаботится о I.
Поскольку N и I переназначаются во время цикла, как это влияет на переменные цикла For с одинаковыми именами? Остается ли значение 2+int(√N) исходным в течение всего цикла?
Я не уверен, что в Ti-Basic происходит одно из следующего:
n=3
For (i, 1, n)
"""""""""""""Does n get updated?
Disp i, n
n+1->n
End
образец вывода:
1, 3
2, 4
3, 5
4, 6
5, 7
6, 8
7, 9
...
в качестве альтернативы, если предположить, что цикл For повторно инициализируется каждый раз, когда его конечное значение границы изменяется, пример вывода:
1, 3
1, 4
1, 5
1, 6
1, 7
1, 8
1, 9
...
Что произойдет, если мы аналогичным образом переназначим i во время цикла?
Нужно ли мне что-то знать о локальных переменных и локальных областях видимости?
Чтобы эта программа работала математически, я думаю, что цикл For должен перезапускаться каждый раз, когда обнаруживается, что N имеет правильный делитель. Но в программе этого не происходит, или нет?
Пробовал установить эмулятор безуспешно. У меня больше нет калькулятора TI. Я понимаю, что существует несколько языков TI-Basic (насколько мне известно, в версии TI-83, среди прочего, отсутствовали локальные переменные). Если ответ на мой вопрос зависит от TI-Basic, то я не знаю, что еще сказать.