我在haskell中有这个if-else子句。
let f x y = if y/=0 then f (x+1) (y-1) else x in f 3 5
结果是8.我无法理解为什么。
有人可以逐步向我解释吗? 谢谢你的帮助!
答案 0 :(得分:16)
好的,让我们首先使用缩进来使函数定义更清晰
let f x y =
if y/=0
then f (x+1) (y-1)
else x
in f 3 5
首先使用参数3
和5
调用f。 y
为5(即非0),执行then
分支,使用参数4
和4
调用f。由于y
仍然不等于0,我们再次进入then
分支并使用参数5
和3
调用f。这一直持续到我们最终使用x = 8
和y = 0
来调用f。然后我们进入条件的else
分支,它只返回x
,即8。
以下是表达式f 3 5
可以减少的一种方式:
f 3 5 -- y /= 0, so we go into the then branch
=> f (3 + 1) (5 - 1)
=> f 4 4 -- then branch again
=> f (4 + 1) (4 - 1)
=> f 5 3
=> f (5 + 1) (3 - 1)
=> f 6 2
=> f (6 + 1) (2 - 1)
=> f 7 1
=> f (7 + 1) (1 - 1)
=> f 8 0 -- this time we go into the else branch
=> 8