Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2014, 14:27   #1
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию рекурсия определение простого числа

вот код ,определяет является ли число простым
непонятно, почему когда переменная b становится = false
то рекурсия тут же прерывается не дойдя до конечного
условия if m = n
Код Pascal
Код:
 
 var m, //число на которое делим n (n mod m ...)
      n: integer;//определяем является ли это число простым
Function Simple(n,m: integer):boolean;
  var b: boolean;
   begin
    if m = n then b:= True
     else
   b:= (n mod m <>0)and Simple(m+1,n);
    Simple:= b;
  end;{End Simple}
{*** ОСНОВНОЕ ТЕЛЕСЕ ****}
 BEGIN
  n:= 10;m:= 2;
writeln(Simple(n,m));
 END.

Последний раз редактировалось Stilet; 04.12.2014 в 14:49.
ujif вне форума Ответить с цитированием
Старый 05.12.2014, 11:38   #2
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

так и не смог сообразить ,почему при b = false
рекурсия сразу прекращается, если сделать перестановку
такую b:= Simple(m+1,n)and(n mod m <> 0);
тогда рекурсия идет до конца , пример взят из
книги Окулова "программирование" стр.152
переделал под себя , во всяком случае для меня
стала более понятна работа процедуры т.е. функцию
переделал на процедуру, а то мне кажется заморочки...

PHP код:
  var n,minteger;
       
bboolean;
Procedure Simple(bboolean;m,ninteger);
   
Begin
    
if n then b:= true
      
else begin
     
if false then exit;
     
Simple(n mod m <> 0,1,n);
    
end;
   
end;
{****  
ОСНОВНОЕ ТУЛОВИЩЕ *********}
 
BEGIN
  n
:= 10;
  
m:= 2;
  
b:= true;
 
Simple(b,m,n);
 if 
b then 
writeln
('число простое')
  else
writeln('число не простое'); 
Конечно , n можно было не вставлять в процедуру
в качестве параметра ибо это глобальная переменная,
но может кому захочется разобрать , будет более понятно
ujif вне форума Ответить с цитированием
Старый 05.12.2014, 11:47   #3
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
function Simple(n:integer):boolean;
var i,c:integer;
begin
   Result:=false;
   If n<2 then
      Exit;
   c:=0;
   For i:=1 to n do
      If n mod i=0 then
         c:=c+1;
   Result:=c=2;
end;

begin
   Writeln(Simple(6));
   Readln;
end.
Возьми готовое у меня!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 05.12.2014 в 11:56. Причина: Сократил код
newerow1989 вне форума Ответить с цитированием
Старый 05.12.2014, 11:57   #4
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

спасибо за поддержку Уважаемый newerow1989
раз уж Вы откликнулись и код у Вас такой симпатичный,
предположу ,что Вы достаточно хорошо разбираетесь чего
происходит в результате выполнения программ..
у меня к Вам вопрос ,тот что здесь я задал в самом первом
своем посте именно: "непонятно, почему когда переменная b становится = false
то рекурсия тут же прерывается не дойдя до конечного
условия if m = n" ..был ответ ,что проверяется только первое условие,
когда переставил выражения , действительно, рекурсия доходит до m = n
тогда такой вопрос : если b принять = true тогда в ней запоминается
первый отличный от true результат ,..НО почему работу то прекращает = не пойму
ujif вне форума Ответить с цитированием
Старый 05.12.2014, 12:03   #5
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

мне не код нужет, я с рекурсией хочу разобраться
ujif вне форума Ответить с цитированием
Старый 05.12.2014, 12:05   #6
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Цитата:
почему когда переменная b становится = false
Нет выражения b:=false; в коде
Цитата:
НО почему работу то прекращает = не пойму
Дописать:
Код:
Readln;
перед
Код:
end.
в последних строках.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 05.12.2014, 12:08   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
так и не смог сообразить ,почему при b = false
рекурсия сразу прекращается, если сделать перестановку
такую b:= Simple(m+1,n)and(n mod m <> 0);
тогда рекурсия идет до конца
Код:
b:= a1 AND a2 AND a3 AND ...
Логические выражения вычисляются слева-направо и, если встретился результат False, то дальнейшие вычисления не происходят. По моему есть препроцесорная команда, которая отменяет эта. Для OR аналогично, только True прерывает процесс вычисления
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.12.2014, 12:10   #8
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

b = true всегда!
Если переписать
Код:
Procedure Simple(var b: boolean;m,n: integer);
то выйдет ошибка в строке
Код:
Simple(n mod m <> 0,m + 1,n);
надо как-то переписать эту строку наподобии
Код:
Simple(b,m + 1,n);
и указать в этой процедуре в каком случае b := false!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 05.12.2014, 12:14   #9
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

cнова привожу этот код ,
при тех значениях m и n которые тут указаны
рекурсия сразу "записывает" в b false
и работа функции прекращается ..
т.е. сразу готов результат безо всяких лишних вызовов
вопрос простой,ПОЧЕМУ когда b становится = false
сразу происходит выход из рекурсии ,,ну и что что b стало = false
ну не доходит это до меня
PHP код:
 var m//число на которое делим n (n mod m ...)
      
ninteger;//определяем является ли это число простым
Function Simple(n,minteger):boolean;
  var 
bboolean;
   
begin
    
if n then b:= True
     
else
   
b:= (n mod m <>0)and Simple(m+1,n);
    
Simple:= b;
  
end;{End Simple}
{*** 
ОСНОВНОЕ ТЕЛЕСЕ ****}
 
BEGIN
  n
:= 10;m:= 2;
writeln(Simple(n,m));
 
END
ujif вне форума Ответить с цитированием
Старый 05.12.2014, 12:15   #10
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

у меня FPC .не знаю может в турбо по другому чего нить
ujif вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вылет программы при выводе простого числа (cout) Ciberal Общие вопросы C/C++ 7 27.09.2011 01:51
Где ошибка в Яваскрипт поиск простого числа? shavtan Помощь студентам 0 21.05.2011 13:10
генерация простого числа для ключа в RSA Coraline Общие вопросы C/C++ 0 16.05.2011 14:30
паскаль. нахождение простого числа Кинива Паскаль, Turbo Pascal, PascalABC.NET 3 09.06.2010 22:54
граница проверки простого числа fs444 Общие вопросы C/C++ 4 24.03.2010 20:11