IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> функция
сообщение
Сообщение #21


Гость






Если имя функции написано справа от знака присваивания - то это в любом случае трактуется компилятором как рекурсия. Для решения данной проблемы можно описать переменную result (которая уже есть в более новых компиляторах), и пользоваться ей, и только в самом конце присвоить ее значение имени функции, НО...

Возникает вопрос: а зачем тебе это? Зачем понадобилось внутри функции получать ее же значение? А если оно еще не вычислено до конца, тогда что?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Для решения данной проблемы можно описать переменную result
А можно пример, если не трудно?
Цитата
Возникает вопрос: а зачем тебе это?
Например, есть рекурсия по нахождению факториала и мне надо вывести промежуточные значения этого факториала, или одно из значений функции понадобилось 2-3 раза (что-то вроде такого примера, из-за чего и возник этот вопрос).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гость






Я так и не понял, зачем тебе внутри функции ее же значение понадобилось несколько раз? Ну, ладно...

var i: integer;

function f(value: integer): integer;
var result: integer;
begin
result := value + 30; { <--- Предварительный результат функции }
{ ... }
i := result; { <--- Запоминаем }

{ ... }
result := result * 3; { пришлось еще ДОвычислить }
f := result; { <--- окончательный результат }
end;

begin
writeln('function = ', f(12)); { <--- Печатаем окончательный результат }
writeln('i = ', i) { <--- А это - промежуточный }
end.

Хотя опять же - я бы так делать не стал: во-первый, глобальные переменные не люблю, а во вторых - не могу представить, КАК это может понадобиться. Пример (конкретный, а не "допустим, нам понадобится") - в студию... Что именно понадобится, для чего надо сохранять значение ЭТОЙ же функции???

Цитата
Например, есть рекурсия по нахождению факториала и мне надо вывести промежуточные значения этого факториала
Я, кажется, уже написал, что если у тебя рекурсия по нахождению факториалов - то она должна их находить, а не печатать. Это не ее задача, понимаешь? А понадобилось печатать - оберни эту функцию еще одной, или напиши новую, тебе же будет проще потом отлаживать...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


function f(n:integer):byte;
var
k:byte;
begin
k:=0;
repeat
n:=n div 10;
inc(k)
until n<=0;
f:=k
end;
Функция подсчета количества цифр в числе.
Цитата
Я так и не понял, зачем тебе внутри функции ее же значение понадобилось несколько раз
Лучше всего завести переменную (в этой функции-К) и делать с ней все что угодно, а потом это значение присвоить функции, но у меня почему-то всегда появляются такие вопросы: А что если так? А что если...
Спасибо за пример и обяснение good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гость






Цитата
Функция подсчета количества цифр в числе.
элементарно переписывается вообще без этой самой доп. переменной:
function f(n: integer): byte;
begin
if n < 10 then f := 1
else f := 1 + f(n div 10);
end;
, если что smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
если что smile.gif
А так куда лучше yes2.gif
Еще раз СПАСИБО!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.10.2020 3:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name