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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 13:30   #1
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию Рекурсивное зацикливание

В общих чертах о задаче:задача про распределение масс множества материальных точек. Отсортировал по возрастанию и вытаюсь рекурсией её распределять пока одна не останется, либо несколько одинаковых.

Впервые решил использовать рекурсию и не оч разобрался

Код:
procedure Distribution(var a:array of real; n:integer);
var i,r:integer;
begin
 r:=n-1;
 i:=0;
 while (abs(a[0]-a[r])>0.000001) do
  begin
   while(i<r) do
    begin
     a[i]:=a[i]+a[r]*0.9/r;
     i:=i+1;
    end;
   n:=r;
   Distribution(a,n);
  end;

end;
Вроде функция должна возвращаться после невыполнения условия нового рекурсивного вызова. И на это моменте она и начинает циклиться. Ставит значение r = 1 и всё.

Последний раз редактировалось Stilet; 05.07.2010 в 14:13.
Alex_Almaty вне форума Ответить с цитированием
Старый 05.07.2010, 13:34   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Не знаю чего не так, но при заголовке
Код:
procedure Distribution(var a:array of real; n:integer);
такая строка
Код:
n:=r;
явно не по фень-шую . А как Вы думаете, почему?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.07.2010, 13:48   #3
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Вроде нет здесь часть неудаленного кодаона вроде не влияла. Вся проблема когда функция вызывалась рекурсивно несколько раз, а потом начала "возвращаться". Вот тут то и проблема возникла.
Alex_Almaty вне форума Ответить с цитированием
Старый 05.07.2010, 13:53   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

А Вы бреакпоинтами его, бреакпоинтами . Рекомендую на строчке:
Код:
Distribution(a,n);
при каждом входе посмотреть чему равно n.
Цитата:
здесь часть неудаленного кода
В смысле? Рояль в кустах?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.07.2010, 07:20   #5
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
А Вы бреакпоинтами его, бреакпоинтами .
Пробовал, безуспешно
Alex_Almaty вне форума Ответить с цитированием
Старый 06.07.2010, 07:29   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Alex_Almaty Посмотреть сообщение
Пробовал, безуспешно
Что безуспешно? n изменяется как положено?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.07.2010, 07:32   #7
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Всё окзакидал весь код exit-ами и норм сталоспстема офф
Alex_Almaty вне форума Ответить с цитированием
Старый 06.07.2010, 07:38   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

В приличном обществе, таком как наше , принято выкладывать результаты решения (в случае если код небольшой), чтобы следующие уже с помощью поиска находили решение и не наступали на те же грабли.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.07.2010, 07:49   #9
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

okкод был не сильно изменен как и сказал Utkin, проблема была в n:=r;

Работающая функия:

procedure Distribution(var a:array of real; n:integer);
var i,r:integer;
begin
r:=n-1;
i:=0;
while (abs(a[0]-a[r])>0.000001) do
begin
while(i<r) do
begin
a[i]:=a[i]+a[r]*0.9/r;
i:=i+1;
end;
Distribution(a,r);
exit;
end;

Если будут желающие, выложу весь код программы(большой просто)

Еще раз спс за помощь
end;
Alex_Almaty вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание программы Arcanum Общие вопросы Delphi 7 12.04.2010 10:20
Зацикливание в паскале. sir.andrey Помощь студентам 2 19.03.2010 13:57
Почему получается зацикливание?? _Studentka_ Общие вопросы по Java, Java SE, Kotlin 1 09.12.2009 02:13
Рекурсивное решение задачи о Ханойских Башнях bullvinkle Помощь студентам 2 01.04.2008 13:09