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

> Прочтите прежде чем задавать вопрос!

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> рекурсия, Определить число, получаемое выписыванием в обратном порядке цифр зада
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


Определить число, получаемое выписыванием в обратном порядке цифр заданного натурального числа (использовать рекурсивную функцию). Ничего не приходит в голову blink.gif Кто-нибудь, дайте пожалуйста направление(код постараюсь написать сам)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

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

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


брать остатока от деления на 10, делай с ним что надо, и дели число на 10. Так пока число не будет равно 0.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


Цитата(Client @ 2.04.2010 16:21) *

брать остатока от деления на 10, делай с ним что надо, и дели число на 10. Так пока число не будет равно 0.

ааа, точно! как я не догадался? спасибо большое smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


черт, даже не знаю, как это можно написать с рекурсией sad.gif ведь после операции mod 10 мы потеряем все остальные числа
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
ведь после операции mod 10 мы потеряем все остальные числа
Ничего не потеряем:
procedure rec(x: longint);
begin
if x > 0 then
begin
write(x mod 10);
rec(x div 10);
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


спасибо! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


а реально ли сделать это через функцию, а не процедуру?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

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

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


пол часа мучений стоили этого smile.gif
скорей всего можно и по другому.
вот что получилось
uses crt;
var
a,b:integer;

function asd(x,i:integer) :integer;
begin
if x=0 then asd:=-b
else begin
if x div 10 <>0 then
b:=b +i*10+ x mod 10;
asd:=(i*10+ x mod 10) + asd(x div 10,i*10+ x mod 10 )
end;
end;

begin
clrscr;
b:=0;
readln(a);
writeln(asd(a,0));
readkey
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
скорей всего можно и по другому.
Можно конечно... Заметь, без побочных эффектов. Старайся вообще обходиться без них. А уж об использовании глобальных переменных я вообще не хочу вспоминать smile.gif

function r(x: longint): longint;
const b: longint = 0;
begin
if x = 0 then begin
r := 0; b := 1;
end
else begin
r := r(x div 10) + b * (x mod 10); b := 10 * b;
end;
end;

begin
writeln(r(12345));
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


спасибо огроменное good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


Цитата(volvo @ 2.04.2010 23:13) *

Можно конечно... Заметь, без побочных эффектов. Старайся вообще обходиться без них. А уж об использовании глобальных переменных я вообще не хочу вспоминать smile.gif

function r(x: longint): longint;
const b: longint = 0;
begin
if x = 0 then begin
r := 0; b := 1;
end
else begin
r := r(x div 10) + b * (x mod 10); b := 10 * b;
end;
end;

begin
writeln(r(12345));
end.


 const b: longint = 0;
begin
if x = 0 then begin
r := 0; b := 1;
а разве можно константе b=0 присвоить значение b:=1?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(marwell @ 3.04.2010 10:23) *
а разве можно константе b=0 присвоить значение b:=1?
Типизированной константе - можно. По сути, это просто инициализированные переменные. Неудачное название им дали в Борланде..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


программа выдает только нули blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(marwell @ 3.04.2010 10:38) *
программа выдает только нули blink.gif

Попробуй вот так:
function r(x: longint): longint;
var
a,b,c,d: longint;
begin
if x = 0 then
r := 0
else begin
b:= 1;
while x div b div 10 > 0 do b:=b*10;
a:= x div b;
c:= x-a*b;
d:= 1;
while c div d div 10 > 0 do d:=d*10;
r := a + b div d*r(c );
end;
end;

begin
writeln(r(12345));
end.

Тут наверняка наворочено больше, чем нужно, и не очень красиво ))..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

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

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


хм, а собственно где нули получаются? при каких данных?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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


Цитата(Client @ 3.04.2010 10:55) *

хм, а собственно где нули получаются? при каких данных?

с твоим-то кодом все работает))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Профи
****

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

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


volvo good.gif есть над чем подумать smile.gif

Добавлено через 2 мин.
код volvo рабочий. Что не так?


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата(Client)
Что не так?
Не так работает под Турбо-Паскалем, надо разбивать вычисление выражения на 2 этапа:
function r(x: longint): longint;
const
b: longint = 0;
var v: longint;
begin
if x = 0 then begin
r := 0; b := 1;
end
else begin
v := r(x div 10); { <--- Первый этап }
r := v + b * (x mod 10); b := 10 * b; { <--- Второй этап }
end;
end;

begin
writeln(r(1234543));
end.
Вот теперь будет работать одинаково под любым компилятором.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(volvo @ 3.04.2010 12:50) *
Не так работает под Турбо-Паскалем
У меня не каждый раз срабатывала под FPC.. Сейчас воспроизвести не могу.
Не знаю, стоит ли полагаться на такие вещи..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Цитата
стоит ли полагаться на такие вещи..
На какие такие? Я не делаю ничего запрещенного, заметь, сначала - рекурсивный вызов, потом - использование значения b. То есть, никогда не будет использовано неинициализированное тобой значение b. Чтобы оно начало использоваться - рекурсия должна дойти до конца (x = 0), но тогда b уже станет равно 1. Опять же, "типизированная константа" = "статическая переменная", она описывается в сегменте данных (а не в стеке, как обычная переменная), и поэтому сохраняет свое значение не только между вызовами простых функций, но и между вызовами рекурсивных тоже, так что и с этой стороны подвохов быть не может. Так что это вполне приемлемая конструкция.

Цитата
У меня не каждый раз срабатывала под FPC
Если еще у кого-то будут неправильные срабатывания - отпишитесь здесь, интересно, на каких значениях это происходит. Чему разно изначальное число, и что возвращает функция. Единственный вариант, который приходит в голову - это когда "перевернутое" число не влезет в LongInt (например, 1234567899), но тут уж ничего не поделаешь.
 К началу страницы 
+ Ответить 

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

 





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