Переназначение переменных в цикле в простой программе на TI-Basic

В своих заметках (из конца 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 или автор допустил баг, допустил ошибку или вообще продемонстрировал плохой стиль программирования.

Позвольте мне описать программу, как я ее понимаю:

  1. запросить ввод N, предположим, int
  2. если N четное, обновить N до следующего нечетного
  3. цикл For: объявите переменную I, которая будет потенциальным делителем N. I начинается со значения 3, так как мы знаем, что N нечетно. I должен быть увеличен на 2 с (то есть 3, 5, 7,..., 2+int(√N)).
  4. тело цикла 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, то я не знаю, что еще сказать.


person sasha    schedule 19.06.2019    source источник


Ответы (2)


Сохранение значения переменной, используемой в качестве счетчика цикла, разрешено, его можно использовать, например, для повторного запуска цикла. Установка I в 1 означает (благодаря добавлению, сделанному For( с шагом 2), что следующая итерация имеет I=3, так что это нормально.

Сохранение нового значения в переменной, используемой как (или in, привязка цикла может быть сложным выражением), привязка цикла также разрешена, но границы цикла не пересчитываются во время цикла, поэтому на зацикливание не влияет. Таким образом, в этой программе граница цикла на самом деле не поднимается вверх, хотя, похоже, она полагается на это. Но я не смог найти ни одного примера того, что это действительно пошло не так. Я думаю, что здесь должно было бы произойти то, что благодаря 2+ потребовался бы простой промежуток с двумя квадратами в нем (таким образом, целая часть квадратного корня может увеличиться на 2, и мы не не встретите простое число), и тогда второй квадрат может быть ошибочно идентифицирован как простой (если это квадрат простого числа). Существует гипотеза о том, что такой ситуации не бывает, хотя это и не доказано, но отсутствие опровержения означает, что самый низкий пример в любом случае будет недосягаем для программы TI-BASIC. Не думаю, что автор это имел в виду...

В TI-BASIC нет локальных переменных и ничего похожего на лексическую область видимости. Переменные, используемые в программах, — это те же самые переменные, которыми пользователь может манипулировать с главного экрана (и других применимых мест), и которые используются другими программами.

person harold    schedule 20.06.2019
comment
Я обновил сообщение, потому что я чувствовал, что моя первоначальная формулировка была неясной. Спасибо за ответ, вы прояснили несколько вопросов. Вы правы насчет простых пробелов, и, поскольку, как вы говорите, граница конечного цикла не переоценивается, это ставит N для меня, оставляя меня беспокоит только то, что происходит с I во время итерации. :) - person sasha; 29.06.2019

с небольшими правками(программа выглядит так)

    Input 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 N

оно работает. краткий ответ заключается в том, что в ti-basic команда end остается, что это конец блока кода. Его можно интерпретировать как

    Input N
    If (N/2)=int(N/2)
    1+N→N
    For(I,3,2+i```Part(√(N)),2)
        If (N/I)=iPart(N/I):Then
            2+N→N
            1→I
    Disp N

это полезно?

person KillerQuow    schedule 21.06.2019
comment
отступ может быть полезен для некоторых, я мог бы разобрать код без необходимости отступа. Что было бы действительно полезно, так это если бы я мог понять (1) почему присваивание 1->I необходимо в цикле (2) как оно влияет на переменную цикла For I. - person sasha; 29.06.2019
comment
@sasha призыв установить I к одному я не считаю нужным. нет переменных класса или чего-то еще, все глобально. это делает переменную цикла for I 1. хотя это не похоже на то, что она что-то делает. 2 и 3 выводят 5, хотя. - person KillerQuow; 01.07.2019