我在尝试跟踪函数中的计数器变量时遇到了一些困难.
我创建了一个函数,它将一个数字作为单个参数,并递归地将该数字乘以2,将所有数字相乘的两个相加,下面的代码使我更清楚我打算做什么:
sum :: Float -> Float
sum x = x + sum (2*x)
Run Code Online (Sandbox Code Playgroud)
但是,我面临的困难是,我希望这个函数只递归十次.所以我希望一旦添加十个数字就停止它.我尝试使用计数器来跟踪函数递归的次数,但无济于事.
这是我试过的:
sumTen :: Float -> Float
sumTen x n
where
n=10
|n == 0 = x
|otherwise = x + sumTen (2*x) (n-1)
Run Code Online (Sandbox Code Playgroud)
我意识到上面的代码不起作用,计数器n将通过每次递归调用给出值十,这意味着它永远不会达到基本情况n == 0.
使这如此困难的原因是sumTen必须使用一个参数调用.在上面的代码中,我试图给函数一个n带有预定值的默认参数,但它显然不起作用.
有人可以帮助我在'n'递归调用后使递归函数停止吗?
您可以使用辅助功能:
sumNRec x 0 = 0
sumNRec x times = x + sumNRec (x*2) (times - 1)
sumTen x = sumNRec x 10
Run Code Online (Sandbox Code Playgroud)