LINUX.ORG.RU

задачка от Непейводы


0

0

Пока ехали в автобусе с Переславльской конфы Николай Николаич задал задачку: Чего делает функция

f(x) = if x>100 then x-10 else f(f(x+11))

двойная рекурсия это просто какая то жопа :)

PS: конфа была очень интересной и прошла успешно, даже упоминалась идейность биореактора :)

★★
Ответ на: комментарий от lg

def f (x):
    if (x > 100):
        return x - 10
    else :
        return f(f(x+11))

for i in range (444):
    print "f("+`i`+")="+`f(i)`

и не надо говорить, что так не честно :)

Pi ★★★★★
()
Ответ на: комментарий от lg

как ты понимаешь смысл то задачи не в том чтобы получить ответ, а чтобы понять как устроена эта функция и почему она себя ведёт именно так ..

написать программу(да она уже посути написана мной в условии[на языке скажем CML - Castrated Meta Language]) - так что получить ответ смог бы и трёхлетний ребёнок

lg ★★
() автор топика
Ответ на: комментарий от Pi

> не это не значит, что она стала менее интересна ;)

и это радует :)

lg ★★
() автор топика
Ответ на: комментарий от lg

> на языке скажем CML - Castrated Meta Language

Нормальный haskell, только лишнюю пару скобок убрать. f x = if x>100 then x-10 else f(f(x+11))

А в чем проблема "понять как устроена эта функция"? По моему, достаточно очевидно; в чем фишка?

Cantor ★★
()
Ответ на: комментарий от Cantor

> А в чем проблема "понять как устроена эта функция"? По моему, достаточно очевидно; в чем фишка?

не знаю, расскажи своё понимание как она устроена?, почему она она в конечном итоге результат скатывается к 91 для всех малых аргументов? как можно было найти решение аналитически?

lg ★★
() автор топика

Ну вы блин программахеры совсем головой приударились.

То, что со всеми вами, тут присуццтвующими, происходит, называется "инертность мышления". Для вас рекурсивная функция - это функция, блин, и никаких гвоздей.

И никому в голову не пришло рассмотреть её как УРАВНЕНИЕ. Имеющее тривиальное решение. А ещё лямбдами всякими владеем-с. Грустно-с. :(

anonymous
()
Ответ на: комментарий от lg

Если немного подумать то можно записать, что твоя функция 

f(x) = if x>100 then x-10 else
         if x>89 then f(x+1) else
         if x>78 then f(x+12) else
         if x>67 then f(x+23) else
        ...
        if x>100-i*11 then f(x+(i-1)*11+1) else ...

i - от едниницы

а дальше ваще просто... 

anonymous
()
Ответ на: комментарий от anonymous

А это уже упражение на перевод рекурсии к циклу

while (x<=100) { if x in (89..100) x=x+1; if x in (78..89] x = x+12; if x in (67..78] x = x + 23;

...

}

anonymous
()
Ответ на: комментарий от anonymous

А это уже упражение на перевод рекурсии к циклу

while (x<=100)
{
    if  x in (89..100) x=x+1;
    if  x in (78..89] x = x+12;  
    if  x in (67..78] x = x + 23;

   ...

}

x = x-10;

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.