如何通过函数编程多次调用一个函数?

时间:2019-09-06 13:57:23

标签: typescript functional-programming

我是函数编程和打字稿的新手。有人告诉我只能使用递归,所以不允许for循环。如何通过递归调用函数n次?

这是命令式伪代码

for i <- 0 to n:
    f(x) //function call

我尝试过:

function loop(n:number, f:()=>number):number [
    return n > 0? loop(n-1, f) : f;
}

但是我意识到,只有当n = 1时,它才返回f。我想要调用f n次。我可以知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

最简单的递归解决方案:

// Your function
functionName = () => {
  console.log('functionName was called');
}

// Caller function
callFunctionNTimes = n => {
    if(n && n > 0) {
      functionName();
    return callFunctionNTimes(n - 1);
  }
}

// Use
callFunctionNTimes(2);

输出:

  

functionName被称为
  functionName被称为

简化语法:

callFunctionNTimes = n => {
    const recursionCondition = n && n > 0;
    recursionCondition && functionName()
    recursionCondition && callFunctionNTimes(n - 1);
}

高阶函数:

functionName = () => {
  console.log('functionName was called');
}

callFunctionNTimes = (functionForExecute) => n => {
    const recursionCondition = n && n > 0;
    recursionCondition && functionForExecute();
    recursionCondition && callFunctionNTimes(functionForExecute)(n - 1);
}

callFunctionNTimes(functionName)(2);

答案 1 :(得分:0)

泛型

我可能会使用generics来写它,例如下面的T-

function hello (name: string): string {
  return `hello ${name}`;
}

function loop<T>(n: number, f: (x: T) => T, x: T): T {
  return n > 0 ? loop(n-1, f, f(x)) : x;
}

console.log(loop(3, hello, "world"));
// hello hello hello world

编译为-

"use strict";
function hello(name) {
    return `hello ${name}`;
}
function loop(n, f, x) {
    return n > 0 ? loop(n - 1, f, f(x)) : x;
}
console.log(loop(3, hello, "world"));
// hello hello hello world


别弄砸了

直接递归会导致JavaScript中的堆栈溢出。如果要循环执行数千次功能,则需要将其转换为while循环one wayanother-

这是一种简单的方法-

function hello (name: string): string {
  return `hello ${name}`
}

function loop<T>(n: number, f: (x: T) => T, x: T): T {
  while (n-- > 0) x = f(x)
  return x
}

console.log(loop(20000, hello, "world"));
// hello hello hello ... hello world

编译为-

"use strict";
function hello(name) {
    return `hello ${name}`;
}
function loop(n, f, x) {
    while (n-- > 0)
        x = f(x);
    return x;
}
console.log(loop(20000, hello, "world"));
// hello hello hello ... hello world