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