Уравнение Руби для функции гнезда Математики? - PullRequest
1 голос
/ 24 февраля 2012

Вот функция гнезда Mathematica Определение .Что за экв.в Ruby?

Идея такова:

nest(f, x, 3) #=> f(f(f(x)))

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вы можете определить свой собственный, используя inject:

def nest(f, x, n)
  n.times.inject(x) { |m| f.call(m) }
end

Тогда вы могли бы назвать это так:

>> def f(x) 2*x end
>> nest(method(:f), 1, 3)
=> 8

Если вы хотите вернуть функцию (т.е. не указывать x), вы можете вернуть лямбду:

def nestx(f, n)
  ->(x) { n.times.inject(x) { |m| f.call(m) } }
end

и используйте его так:

>> nestx(method(:f), 3).call(1)
=> 8

Или вы можете изменить nest аргументы и использовать Proc#curry:

def nest(f, n, x)
  n.times.inject(x) { |m| f.call(m) }
end

>> method(:nest).to_proc.curry.call(method(:f), 3).call(1)
=> 8

Вы также можете использовать [] вместо call, если хотите что-то, что больше похоже на вызов функции:

def nest(f, n, x)
  n.times.inject(x) { |m| f[m] }
end

>> method(:nest).to_proc.curry[method(:f), 3][1]
=> 8
1 голос
/ 24 февраля 2012

Я не знаю Ruby, но я заглянул в описание языка и написал следующий код ..

Пусть это будет ваша функция

def func(­x)  
   return sin(x­)
end

и позвольте определить функцию гнезда

def nest(­f, x, n)
    count = 0
    while count­<n
        x = send(f, x)
        count += 1
    end
    return x
end

Назовите его как nest(:func­, 1, 3), и результат будет 0.67843047736074

Я сравнил результат с результатом http://www.wolframalpha.com и получил тот же ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...