Понедельник, 18 Ноября 2024, 01:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Задачка по паскалю.
Knight1032Дата: Воскресенье, 01 Апреля 2012, 21:50 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Учу паскаль.
Знаю что вопрос не по геймдеву, но помогите решить задачу:
Вычислить, используя рекурсивный алгоритм сумму первых N чисел натурального ряда S.
Входные данные:
В первой строке входного потока задано единственное натуральное число N (N <= 100)

Выходные данные:
В выходной поток вывести единственное натуральное число S

Пример входного файла (input.txt):
1
Пример выходного файла (output.txt):
1
Запрещенные слова (Pascal): for,while,repeat
Не совсем понятно как это реализовать без цикла(вообще). Помогите.


Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Воскресенье, 01 Апреля 2012, 21:58 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Knight1032, функции и процедуры(как подпрограммы) изучал?
Knight1032Дата: Воскресенье, 01 Апреля 2012, 22:06 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
mitch, изучал. Но я не могу понять как сделать без цикла обращение к функции?

Добавлено (01.04.2012, 22:06)
---------------------------------------------
Или как тут вообще делать.
Как я люблю циклы. )


Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Воскресенье, 01 Апреля 2012, 22:11 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Knight1032,
нужно в самой функции/процедуре вызывать ее саму при определенных условиях
например, если текущее шагов число меньше, чем заданное, то вызывать процедуру, в которой прибавляется единица к сумме и делается та же проверка
Knight1032Дата: Воскресенье, 01 Апреля 2012, 22:22 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
mitch, чёт вроде этого? If c <=n then s:=c+s and c:=c+1 else write s; но как обращение сделать?

Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Воскресенье, 01 Апреля 2012, 22:27 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
procedure sum (s, i, n : integer);
begin
inc(i);
s := s + (s + 1);
if i <= n then sum(s, i, n);
end;
что-то типа такого, в основной программе естественно сначала занулить s(сумма) и i(номер текущего шага), считать n(количество чисел) и вызвать саму процедуру один раз, потом выводишь результат
Knight1032Дата: Воскресенье, 01 Апреля 2012, 22:29 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
прости за вопрос а inc это что?

Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Воскресенье, 01 Апреля 2012, 22:31 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Knight1032,
inc(i) равносильно i := i + 1
так же можно сделать inc(i, n), равносильно i := i + n
работает только с целыми числами
Knight1032Дата: Воскресенье, 01 Апреля 2012, 22:40 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
mitch, считать n(количество чисел) как
?


Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Воскресенье, 01 Апреля 2012, 22:47 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Knight1032, ну read(n), то что тебе из входного файла задается или вручную если ты задаешь
Knight1032Дата: Воскресенье, 01 Апреля 2012, 22:54 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
mitch, так? var
s, i, n : integer;
function sum (s, i, n : integer):integer;
begin
inc(i);
s := s + (s + 1);
if i <= n then sum(s, i, n);
end;
begin
read(n);
s:=0;
i:=0;
sum;
write(s);
end.


Да, я программист, дизайнер, сценарист,
Я сам себе издатель и сам себе игрок...
mitchДата: Понедельник, 02 Апреля 2012, 21:06 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
Knight1032, если ты сделал sum функцией, то она присваиваться какой-то переменной должна
и в основной программе когда вызываешь sum, туда нужно передавать параметры
TimKruzДата: Четверг, 05 Апреля 2012, 21:03 | Сообщение # 13
старожил
Сейчас нет на сайте
Knight1032, как-то так можно:
Code
var n:byte;
function sum(n:byte):longint;
begin
   if n>1 then sum:=n+sum(n-1)
   else sum:=n;
end;
begin
   assign(input,'input.txt');
   reset(input);
   read(n);
   close(input);
   assign(output,'output.txt');
   rewrite(output);
   write(sum(n));
   close(output);
end.


Quote (Knight1032)
прости за вопрос а inc это что?

Есть две такие функции (на уровне машинных команд) - инкремент и декремент. Первая увеличивает число на единицу, вторая - уменьшает. В Паскале можно использовать эту функцию для увеличения/уменьшения числа на определённое число, указываемое, как дополнительный аргумент.

Quote (Knight1032)
я не могу понять как сделать без цикла обращение к функции?

В теле подпрограммы могут быть вызваны другие подпрограммы, в том числе и эта же подпрограмма, точно так же, как и в теле программы. Единственная тут проблема в том, что при вызове подпрограмма в стек сохраняется адрес инструкции, с которой нужно продолжить выполнение кода после завершения подпрограммы. Поэтому глубина рекурсивной функции ограничена размером стека.


  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг