Scala 无法理解';函数作为参数';递归

Scala 无法理解';函数作为参数';递归,scala,recursion,functional-programming,sml,ml,Scala,Recursion,Functional Programming,Sml,Ml,我正在学习函数式编程语言课程,在“函数作为参数”的上下文中,我很难理解递归 fun_次(f,n,x)= 如果n=0 然后x else f(n_次(f,n-1,x)) 乐趣双倍x=x+x; val x1=n_次(双倍,4,7); x1的值=112 这是x的n倍,所以7倍4倍=112 我可以理解更简单的递归模式,比如在列表中添加数字,或者“power of”函数,但我无法理解这个函数“n_times”如何通过调用自身进行计算?您可以解释此功能的工作原理吗 我在学习这门课程的过程中使用了scala,

我正在学习函数式编程语言课程,在“函数作为参数”的上下文中,我很难理解递归

fun_次(f,n,x)=
如果n=0
然后x
else f(n_次(f,n-1,x))
乐趣双倍x=x+x;
val x1=n_次(双倍,4,7);
x1的值=112
这是x的n倍,所以7倍4倍=112

我可以理解更简单的递归模式,比如在列表中添加数字,或者“power of”函数,但我无法理解这个函数“n_times”如何通过调用自身进行计算?您可以解释此功能的工作原理吗


我在学习这门课程的过程中使用了scala,以提高我对scala的理解(以及函数式编程),我认为这是一种常见的模式,因此可以提供建议?

如果
n
为0,则返回
x

否则,将返回
f(n_次(f,n-1,x))

n\u次
做什么?它接受调用
f
的结果,调用次数为
x
n
次,或者等价地:调用
f
,调用结果为
n\u次(f,n-1,x)
(调用
f
x
上的n-1次)

请注意,通过调用
f
我的意思是,例如:

呼叫
f
3次:
f(f(f(x)))


调用
f
2次:
f(f(x))
只需手动展开即可。我将调用
n次
nx
以节省空间

核心业务是

nx(f, n, x) -> f( nx(f, n-1, x))
终止于

nx(f, 0, x) -> x
所以,当然

nx(f, 1, x) -> f( nx(f, 0, x) ) -> f( x )
nx(f, 2, x) -> f( nx(f, 1, x) ) -> f( f( x ) )
...
nx(f, n, x) -> f( nx(f,n-1,x) ) -> f( f( ... f( x ) ... ) )

函数
n_次
n=0时有一个基本情况,否则有一个归纳情况。在感应情况下递归,直到在基本情况下终止

下面是一个说明性的跟踪:

n_次(双倍,4,7)
~>double(n_次(double,3,7))(*n=4>0,感应情况*)
~>double(double(n_次(double,2,7))(*n=3>0,感应情况*)
~>double(double(n_倍,1,7))(*n=2>0,感应情况*)
~>double(double(double)(n_次(double,0,7 '))(*n=1>0,感应情况*)
~>double(double(double(double 7))(*n=0,基本情况*)
~>双(双(双14))
~>双倍(双倍28)
双56
~> 112

这与您已经知道的递归思想相同,只是混合了另一个概念:高阶函数

n_times得到一个函数(f)作为参数,因此n_times是一个高阶函数,它反过来能够在他的身体中应用这个f函数。实际上,这是他的工作,将fn次应用于x

那么如何将fn次应用于x呢?好吧,如果你申请n-1次

n_times(f , n - 1 , x)
,然后你再申请一次

f (n_times(f , n - 1 , x))

像往常一样,必须停止递归,这是x的n=0情况。

我想这对我来说太明显了。尝试重写方法(可能使用
n
of 3而不是4),其中重写顶级调用和每个递归调用,结果是将实际参数值替换为函数体中形式参数的引用。这是我的建议。我只是太懒了,没法为这次行动做这件事。