Задачка по паскалю.
|
|
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) я не могу понять как сделать без цикла обращение к функции? В теле подпрограммы могут быть вызваны другие подпрограммы, в том числе и эта же подпрограмма, точно так же, как и в теле программы. Единственная тут проблема в том, что при вызове подпрограмма в стек сохраняется адрес инструкции, с которой нужно продолжить выполнение кода после завершения подпрограммы. Поэтому глубина рекурсивной функции ограничена размером стека.
|
|
| |