Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.03;
Скачать: CL | DM;

Вниз

Тоже пятничная задачка :о)   Найти похожие ветки 

 
default ©   (2007-05-04 20:15) [40]

Внук ©   (04.05.07 20:12) [39]
многие бы за вычисление факториала через рекурсию сняли бы с собеседования враз...


 
Внук ©   (2007-05-04 20:16) [41]

>>default ©   (04.05.07 20:15) [40]
 У каждого свои комплексы


 
Sha ©   (2007-05-04 20:16) [42]

program InverseEven;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var
 s, t: string;
begin
 while true do begin
   ReadLn(s);
   if s="" then break;
   if (StrToIntDef(s,1) and 1)=0 then t:=s + #13#10 + t;
   end;
 Write(t);
 ReadLn;
end.


 
default ©   (2007-05-04 20:18) [43]

Внук ©   (04.05.07 20:16) [41]
когда считается факториал через рекурсию кушается много памяти в стеке
что совсем неоправдано ибо очевидный итеративный вариант память не кушает


 
Alx2 ©   (2007-05-04 20:20) [44]

Понеслось :)
#pragma comment(linker, "/stack:0x8000000")
#include <iostream>
void main()
{
if (!std::cin.eof())
{ int n;
 std::cin>>n;
 main();
 if (!(n&1))
  std::cout<<n<<" ";
}
}


 
Зюзя   (2007-05-04 20:20) [45]

многие бы за вычисление факториала через рекурсию сняли бы с собеседования враз...

Это еще почему это?


 
Внук ©   (2007-05-04 20:21) [46]

>>default ©   (04.05.07 20:18) [43]
 Так я и не говорил, что нужно считать факториал через рекурсию в реальных программах.


 
default ©   (2007-05-04 20:23) [47]

Внук ©   (04.05.07 20:21) [46]

> Я вообще не вижу разницы :) Это лишь вопрос того, где кушать
> память - в массиве, списке или стеке вызовов.

вот это как-то угрожающе звучит...


 
Sha ©   (2007-05-04 20:25) [48]

На строчку короче:

program InverseEven;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var
  s, t: string;
begin
  repeat
    ReadLn(s);
    if (StrToIntDef(s,1) and 1)=0 then t:=s + #13#10 + t;
    until s="";
  Write(t);
  ReadLn;
end.


 
Зюзя   (2007-05-04 20:38) [49]

Факториал - очень быстро растущая функция. То есть, для того, чтобы произошло переполнение разряда даже при использовании int64, нужно взять факториал чего-то около 65. При использовании integer - и подавно. Переполнения стека при 65 рекурсивных вызовах не произойдет. Так все же, почему не стоит считать факториал с использованием рекурсивных алгоритмов?


 
Alx2 ©   (2007-05-04 20:41) [50]

>Зюзя   (04.05.07 20:38)

Потому-что незачем хранить в памяти кучу значений предыдущих факториалов. Можно обойтись одной переменной-аккумулятором.

А насчет переполнения - есть асимптотики. Формула Стирлинга, например. Тогда вообще все считается без циклов и => по времени независимо от аргумента.


 
Alx2 ©   (2007-05-04 20:41) [51]

PS Точность абсолютная не всегда нужна


 
Sha ©   (2007-05-04 20:46) [52]

> Зюзя   (04.05.07 20:38) [49]
> Так все же, почему не стоит считать факториал
> с использованием рекурсивных алгоритмов?

Более того, в учебных задачах принято использовать рекурсию.
В реальных задачах вместо хвостовой рекурсии принято использовать цикл.

Аналогично, в реальной задаче я никогда не написал бы в цикле
t:=s + #13#10 + t;
а в учебной это совершенно нормально.


 
Rouse_ ©   (2007-05-04 20:51) [53]

А я кажется понял в чем фикус. Зотыч щас кодит на яве (этим и обусловлены, по всей видимости, слова о выборе языка), вероятно там есть какой-то хитрозадый метод или класс :) Кто знает яву, отпишитесь плз...


 
Alx2 ©   (2007-05-04 20:52) [54]

>Rouse_ ©   (04.05.07 20:51)

У меня есть подозрения с веткой о функциональных языках. :)


 
McSimm ©   (2007-05-04 20:57) [55]


> незачем хранить в памяти кучу значений предыдущих факториалов

А они и не хранятся, возвращаются сразу после вычисления.

Извиняюсь, но подобные "снятия с собеседования" - обычное "пальцегнутие", разве что задача поставлена корректно, с требованием экономить соответсвующие ресурсы


 
McSimm ©   (2007-05-04 20:59) [56]


> Rouse_ ©   (04.05.07 19:27) [30]
> Да и кода там реально 38 асмовских строк :) Если считать
> только код с джампами :)

Скажи спасибо, что я инклюд не считал :)


 
Rouse_ ©   (2007-05-04 21:00) [57]


> Alx2 ©   (04.05.07 20:52) [54]
> >Rouse_ ©   (04.05.07 20:51)
>
> У меня есть подозрения с веткой о функциональных языках.
>  :)

Дай линк, я не в теме, пропустил видать :)


 
Rouse_ ©   (2007-05-04 21:01) [58]


> Скажи спасибо, что я инклюд не считал :)

Эээ Максим, если я чичас начну юзесы считать, которые нужны для компиляции всего вышеприведенного, то... :)


 
Alx2 ©   (2007-05-04 21:05) [59]

>Rouse_ ©   (04.05.07 21:00)
http://delphimaster.net/view/15-1178220488/

>McSimm ©   (04.05.07 20:57)
К сожалению, в рекурсии они сидят.


 
McSimm ©   (2007-05-04 21:08) [60]


> >McSimm ©   (04.05.07 20:57)
> К сожалению, в рекурсии они сидят.

нет :)


 
McSimm ©   (2007-05-04 21:09) [61]

факториал вычисляется при обратном движении по стеку, а на стеке хранятся параметры.


 
Alx2 ©   (2007-05-04 21:10) [62]

>McSimm ©   (04.05.07 21:08)

Э... Виноват :)
Адреса возврата сидят
для этого, во всяком случае :)
function f(n:integer):integer;
begin
 if n=0 then result := 1
 else
  result := n*f(n-1);
end;


 
Alx2 ©   (2007-05-04 21:11) [63]

>McSimm ©   (04.05.07 21:09)

Да, и параметры.
Сорри.

Но опять таки зачем излишество?


 
Внук ©   (2007-05-04 21:12) [64]

>>Alx2 ©   (04.05.07 20:52) [54]
 Ууу. Помнится, я на прологе факториал считал...


 
McSimm ©   (2007-05-04 21:14) [65]


> Но опять таки зачем излишество?

Иногда - незачем, а иногда это не важно.
Например, на собеседовании :)

Опять же, если не уточнить заранее.


 
Alx2 ©   (2007-05-04 21:18) [66]

>McSimm ©   (04.05.07 21:14)

>Например, на собеседовании :)

Эх... Если еще бы и программерское вероисповедание отгадать :)

>Внук ©   (04.05.07 21:12)

мне запомнился подсчет минимума (максимума)
Программа пишется буквально:
минимум - элемент, меньше которого в списке не существует. :)


 
Alx2 ©   (2007-05-04 21:21) [67]

Эх, треклятое косноязычие...
Вот чего бы стоило не называть то, что в стеке факториалами? Ничего :)


 
Rouse_ ©   (2007-05-04 21:28) [68]


> Alx2 ©   (04.05.07 21:05) [59]

Псиб...

ЗЫ: Кстати в тени постановки задачи особенно в связи с фразой "в то же время максимально понятную" ИМХО самым рациональным будет все-же ассемблер (знай себе - читай инструкции, не вникая в особенности), ибо "языки программирования" бывают разные и тащут за собой столько дряни порой что пользователю тошно становиться (не говоря уже о программах на перле или дотнете, которым нужем сам перл или фреймворк) :)
Ввиду того что языков и ответвлений море, а асм един - только он может удовлетворить всем условиям задачи в полной мере :)


 
McSimm ©   (2007-05-04 21:37) [69]


> Rouse_ ©   (04.05.07 21:28) [68]

я твою программу ни скомпилировать ни запустить не мог, а свою прямо в консоли набирал, без редактора :)


 
Kolan ©   (2007-05-04 22:15) [70]

> и в то же время максимально понятную

Преследовал эту цель :)

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 Contnrs;

type
 TStackForEvenNumbers = class(TStack);

procedure PrintStack(Stack: TStack);
begin
 while Stack.Count <> 0 do
   WriteLn(Integer(Stack.Pop));
end;  

var
 Stack: TStackForEvenNumbers;
 Value: Integer;
begin
 { TODO &#151;oUser &#151;cConsole Main : Insert code here }
 Stack := TStackForEvenNumbers.Create;
 try
   repeat
     ReadLn(Value);
     if not Odd(Value) then
       Stack.Push(Pointer(Value))
   until Value = 0;
   PrintStack(Stack);
   ReadLn;
 finally
   Stack.Free;
 end;
end.


 
Rouse_ ©   (2007-05-04 22:15) [71]


> McSimm ©   (04.05.07 21:37) [69]
>
> > Rouse_ ©   (04.05.07 21:28) [68]
>
> я твою программу ни скомпилировать ни запустить не мог,
> а свою прямо в консоли набирал, без редактора :)

Чтобы скомпилировать FASM нужен, чтобы запустить - клавиатура и винда, а твоя даже в консоли не запустилась :)


 
Alx2 ©   (2007-05-04 22:31) [72]

После подсказки от const (c)  работы с потоками вот так получается:
#include <iostream>
void main()
{
int n;
if (std::cin>>n)
{
 main();
 if (!(n%2)) std::cout<<n<<" ";
}
}


 
default ©   (2007-05-04 23:38) [73]

кстати вот цитата из "Совершенный код" Макконелла по теме рекурсии
"Не используйте рекурсию для факториалов и чисел Фибоначчи

Одна из проблем с учебниками по вычислительной технике в том, что они предлагают глупые примеры рекурсии. Типичными примерами являются вычисление факториала или последовательности Фибоначчи. Рекурсия - мощный инструмент, и очень глупо использовать ее в этих двух случаях. Если бы программист, работающий у меня, применял рекурсию для вычисления факториала, я бы нанял кого-то другого. Вот рекурсивня версия вычисления факториал: ....
Не считая медленного выполнения и непредсказуемого использования памяти, рекурсивный вариант функции трудней для понимания, чем итеративный вариант:...
Из этого примера можно усвоить три урока. Первый: учебники по ВычТеху не оказывают миру услугу своими примерами рекурсии. Второй, и более важный: рекурсия - гораздо более мощный инструмент, чем можно предположить из сбивающих с толку примеров расчета факториала и чисел Фибоначчи, Третий - самый важный: вы должны рассмотреть альтернативные варианты перед использованием рекурсии. Иногда один способ работает лучше, иногда - другой. Но прежде чем выбрать какой-то один, надо рассмотреть оба."


 
Zeqfreed ©   (2007-05-04 23:57) [74]

#!/usr/bin/ruby

puts gets.gsub(/\d?(?:1|3|5|7|9)/, "").split(" ").reverse.join(" ")


Где мой пирожок? :)


 
default ©   (2007-05-04 23:58) [75]

Zeqfreed ©   (04.05.07 23:57) [74]
на эйфелевой башне, залезешь - твой


 
McSimm ©   (2007-05-05 00:02) [76]


> Не считая медленного выполнения и непредсказуемого использования
> памяти, рекурсивный вариант функции трудней для понимания,
>  чем итеративный вариант:...
> Из этого примера можно усвоить три урока.


Из этого фрагмента я бы сделал свой вывод... "автор ездит по ушам" :)

Рекурсивный вариант функции трудней чем итеративный для понимания чего? Понимания вычисления факториала ????

Неужели во всех книгах этот пример используется именно для того, чтобы научить факториал вычислять ?

Или все же для понимания принципа использования рекурсивных алгоритмов ?
Так для этого итеративный вариант похоже подходит весьма слабо :)

А вот как раз чтобы понять работу рекурсии пример F(N) = N * F(N-1) подходит как нельзя лучше.


 
Zeqfreed ©   (2007-05-05 00:04) [77]

> default ©   (04.05.07 23:58) [75]

Там кстати неправильный регексп :(
Щас исправить попытаюсь.


 
Zeqfreed ©   (2007-05-05 00:07) [78]

#!/usr/bin/ruby
puts gets.chomp.gsub(/(|\d+)(1|3|5|7|9)( |$)/, "").split(" ").reverse.join(" ")


Вот так, вроде, корректно.


 
default ©   (2007-05-05 00:08) [79]

McSimm ©   (05.05.07 00:02) [76]
Вы не верите что если неопытному в программировании студенту показать итеративный вариант и рекурсивный вариант ему не будет понятнее итеративный?
автор не ездит по ушам,  а лишь говорит, что в книгах такой мощной инструмент в борьбе со сложностью как рекурсия используется неэффективно и не выявляет всей мощи рекурсии вводя в некоторое заблуждение


 
McSimm ©   (2007-05-05 00:09) [80]


> Вы не верите что если неопытному в программировании студенту
> показать итеративный вариант и рекурсивный вариант ему не
> будет понятнее итеративный?

Понятнее что ?



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.06.03;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.038 c
1-1175524308
DelphiLexx
2007-04-02 18:31
2007.06.03
Аналог TNotebook, но поддерживающий наследование


2-1178970944
Strate
2007-05-12 15:55
2007.06.03
Exeption внутри Thread


2-1179306362
Тимофей
2007-05-16 13:06
2007.06.03
Как создать общий компонент на базе TEdit и TComboBox


11-1158851694
Vladimir Kladov
2006-09-21 19:14
2007.06.03
Версия 2.39


15-1178535115
@!!ex
2007-05-07 14:51
2007.06.03
Подскажите недорогой EGPRS модем.