我是函数编程和打字稿的新手。有人告诉我只能使用递归,所以不允许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次。我可以知道怎么做吗?
答案 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 way或another-
这是一种简单的方法-
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