Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.62 MB
Время: 0.048 c
15-1178717673
webncassd
2007-05-09 17:34
2007.06.03
2а сайта и БД, MYSql


3-1173848735
Xmen
2007-03-14 08:05
2007.06.03
Связь с базой


15-1178403369
vasIZmax
2007-05-06 02:16
2007.06.03
Ребята, оцените. (Если можно покритикуйте)))


15-1178477279
ferr
2007-05-06 22:47
2007.06.03
gdb


15-1178547995
Карелин Артем
2007-05-07 18:26
2007.06.03
Качалка для сети MS.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский