如何在 Lua 中编写 sum(f,n) 的高阶函数?
How would I write an higher-order function of sum(f,n) in Lua?
首先,我当然知道严格来说Lua不支持高阶函数,只支持first-class函数。
但是,我想尝试实现某种函数,对于给定函数和数字 n >= 0,returns 和 0 + f 1 + ... + f n .我的尝试方式如下所示:
function sum(f,n)
if n < 1
then
return 0
else
return sum(f, n-1) + f(n)
end
end
我不确定当我尝试调用它时它是否真的做了它应该做的事情:
print(sum(function(x) return x*x end, 2),3)
First of all, I am of course aware that strictly speaking Lua does not support higher order functions, but only first-class functions.
这是错误的。 Lua 的函数是“first-class” 允许 higher-order 函数:您可以简单地将函数作为参数传递。
I'm not sure though if it really does what it should do when I try to call it: print(sum(function(x) return x*x end, 2),3)
在 Lua REPL 中调用它,我得到了期望的结果 5 = 1^2 + 2^2:
$ lua
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> function sum(f,n)
>> if n < 1
>> then
>> return 0
>> else
>> return sum(f, n-1) + f(n)
>> end
>> end
>
> print(sum(function(x) return x*x end, 2),3)
5 3
虽然我不明白 , 3
的目的(它最终作为 print
的额外参数)。
更有效的实现是使用 for
循环而不是递归:
function sum(f, n)
local sum = 0
for i = 1, n do
sum = sum + f(i)
end
return sum
end
首先,我当然知道严格来说Lua不支持高阶函数,只支持first-class函数。
但是,我想尝试实现某种函数,对于给定函数和数字 n >= 0,returns 和 0 + f 1 + ... + f n .我的尝试方式如下所示:
function sum(f,n)
if n < 1
then
return 0
else
return sum(f, n-1) + f(n)
end
end
我不确定当我尝试调用它时它是否真的做了它应该做的事情:
print(sum(function(x) return x*x end, 2),3)
First of all, I am of course aware that strictly speaking Lua does not support higher order functions, but only first-class functions.
这是错误的。 Lua 的函数是“first-class” 允许 higher-order 函数:您可以简单地将函数作为参数传递。
I'm not sure though if it really does what it should do when I try to call it:
print(sum(function(x) return x*x end, 2),3)
在 Lua REPL 中调用它,我得到了期望的结果 5 = 1^2 + 2^2:
$ lua
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> function sum(f,n)
>> if n < 1
>> then
>> return 0
>> else
>> return sum(f, n-1) + f(n)
>> end
>> end
>
> print(sum(function(x) return x*x end, 2),3)
5 3
虽然我不明白 , 3
的目的(它最终作为 print
的额外参数)。
更有效的实现是使用 for
循环而不是递归:
function sum(f, n)
local sum = 0
for i = 1, n do
sum = sum + f(i)
end
return sum
end