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

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

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

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


Бывалый
***

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

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


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


Профи
****

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

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


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


Бывалый
***

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

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


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

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

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


Бывалый
***

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

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


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


Гость






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


Бывалый
***

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

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


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


Бывалый
***

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

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


а реально ли сделать это через функцию, а не процедуру?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 2.04.2010 22:12
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.04.2010 23:13
Сообщение #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.
 К началу страницы 
+ Ответить 
marwell
сообщение 3.04.2010 3:59
Сообщение #10


Бывалый
***

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

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


спасибо огроменное good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
marwell
сообщение 3.04.2010 9:23
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.04.2010 9:32
Сообщение #12


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

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

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


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


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


Бывалый
***

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

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


программа выдает только нули blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.04.2010 10:43
Сообщение #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 
 К началу страницы 
+ Ответить 
Client
сообщение 3.04.2010 10:55
Сообщение #15


Профи
****

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

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


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


Бывалый
***

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

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


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

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

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


Профи
****

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

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


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

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


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.04.2010 11:50
Сообщение #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.
Вот теперь будет работать одинаково под любым компилятором.
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.04.2010 12:17
Сообщение #19


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

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

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


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


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


Гость






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

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

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

 



- Текстовая версия 27.04.2024 20:15
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"