求助:用递归实现Haskell函数获取n二进制中2^k位的数字
实现思路与代码
首先需要修正函数类型——我们需要接收两个自然数参数(n和k),所以正确的类型签名应为:
Stelle :: Int -> Int -> Int
递归逻辑与起始条件
递归的核心是逐步缩小问题规模,结合div和mod的二进制特性(除以2等价于二进制右移一位,取模2等价于取二进制最低位):
- 起始条件1:当
n == 0时,无论k取值多少,直接返回0(因为0的二进制所有高位都是0) - 起始条件2:当
k == 0时,返回nmod2(二进制第0位就是原数的奇偶性) - 递归步骤:当
k > 0时,将n除以2(右移一位),递归求解Stelle (ndiv2) (k-1)——此时原数的第k位就变成了新n的第k-1位
完整代码
Stelle :: Int -> Int -> Int Stelle 0 _ = 0 Stelle n 0 = n `mod` 2 Stelle n k = Stelle (n `div` 2) (k - 1)
示例验证
Stelle 5 0→ 返回1(5的二进制是101,第0位为1)Stelle 5 1→ 递归调用Stelle 2 0,返回0(第1位为0)Stelle 5 2→ 递归到Stelle 1 0,返回1(第2位为1)Stelle 3 2→ 递归到Stelle 0 0,返回0(3的二进制是11,第2位为0)
内容的提问来源于stack exchange,提问作者user20676598
相关产品推荐
相关产品推荐

