为什么在haskell函数中添加负整数不起作用?

为什么在haskell函数中添加负整数不起作用?,haskell,Haskell,所以我知道这是一种在“倒计时”时使用尾部递归实现指数函数的方法: 但是如果我想实现它(从负y到0),我不太确定为什么它会永远运行并失败?如果有人能向我解释为什么会发生这种情况,以及如何避免这种情况,我将不胜感激。这就是我所尝试的: exponentialDown :: Int -> Int -> Int exponentialDown x y = h_exp x y 1 h_exp :: Int -> Int -> Int -> Int h_exp x 0 ans

所以我知道这是一种在“倒计时”时使用尾部递归实现指数函数的方法:

但是如果我想实现它(从负y到0),我不太确定为什么它会永远运行并失败?如果有人能向我解释为什么会发生这种情况,以及如何避免这种情况,我将不胜感激。这就是我所尝试的:

exponentialDown :: Int -> Int -> Int
exponentialDown x y = h_exp x y 1

h_exp :: Int -> Int -> Int -> Int
h_exp x 0 ans = ans
h_exp x y ans = h_exp x (1-y) (ans*x)

我尝试过这方面的变化,但没有取得任何成果…

一般来说,在递归调用中,从负数开始计算
y
是用
y+1
完成的,使用
y>=0的保护来停止递归
y==0
是您实际需要的,但是
=
用于捕获不需要的正
y
s


或者,您可以在函数定义中使用单独的
y==0
y>0
保护案例,如果您喜欢,可以在后一种情况下报告错误。

请添加特定的具体内容,以便我们能够为您提供特定的解决方案和帮助。写下序列
y{n+1}=1-y\u n
从某个数字开始,你得到了什么?还要注意的是
x^-(n+1)=x^(-n-1)=x^(-n+-1))=x^(-n)/x
所以递归情况下的累加器应该是
h\u exp x(y-1)(ans/y)
。(2^(-2)=1/4)对于负
y
x^y
在一般情况下是
Float
,而不是
Int
exponentialDown :: Int -> Int -> Int
exponentialDown x y = h_exp x y 1

h_exp :: Int -> Int -> Int -> Int
h_exp x 0 ans = ans
h_exp x y ans = h_exp x (1-y) (ans*x)