codewarsの上の1本の訓練の関数式のプログラミングの思惟のプログラミング問題


codewarsの上の1本の訓練の関数式のプログラミングの思惟のプログラミング問題を分かち合います.
https://www.codewars.com/kata/church-numbers-add-multiply-exponents/train/javascript このテーマは多くの紙幅を使って考えを導き、最後に足し算、掛け算、指数乗算の三つの関数を実現させます.ここでは翻訳しません.テーマの条件とすべての目標だけを提供します.
テーマの条件を整理します.
  • 関数churchify:使用方式:churchify(n:Number)(f:function)(x:number)、戻り値はf performed on x n times、すなわちネストはn次f(x)を実行する.この関数の実装形態は多く、主題は直接的に実現された.
    var churchify = (n) => (f) => (x) => {
      for(var i = 0; i < n; i++) x = f(x);
      return x;
    };
  • 関数numerify:パラメータとして関数を受信し、この関数は補助関数であり、定義はこのようなものである.
  • 関数tes Church:この関数は重要です.
    var numerify = (c) => c((i) => i + 1)(0);
  • 三つの関数Add,Mul,Powを設計することを要求します.操作:
  • testChurch(Add,x,y)が返した結果、x+yの結果
  • です.
  • testChurch(Mul,x,y)は、x*yの結果
  • を返します.
  • testChurch(Pow,x,y)が返した結果、x^y(xのy乗)の結果
  • です.
    また、問題はアルゴリズムの複雑さを考慮する必要があります.そうでないとタイムアウトします.直接にMath.powメソッドを起動しないでください.
    この問題はとても面白いです.どうやって解くかを考えてください.答えを教えてください.
    var testChurch = (fn, x, y) => numerify( fn( churchify(x) )( churchify(y) ) )