我完成了以下练习,但我不喜欢该解决方案:


使用递归编写函数isPerfectSquare,以判断是否
整数是一个完美的平方
isPerfectSquare 1->应该返回True
isPerfectSquare 3->应该返回False


num+1部分是isPerfectSquare 0 and isPerfectSquare 1的情况,这是我不喜欢的部分之一,这是我的解决方案:

perfectSquare 0 1 = [0] ++ perfectSquare 1 3
perfectSquare current diff = [current] ++ perfectSquare (current + diff) (diff + 2)

isPerfectSquare num = any (==num) (take (num+1) (perfectSquare 0 1))


有什么更优雅的解决方案?当然,我们不能使用sqrt,也不能使用浮点运算。

最佳答案

@luqui你的意思是这样吗?

pow n = n*n
perfectSquare pRoot pSquare | pow(pRoot) == pSquare = True
                            | pow(pRoot)>pSquare = perfectSquare (pRoot-1) pSquare
                            | otherwise = False
--
isPerfectSquare number = perfectSquare number number


我不敢相信我没有看到它xD非常感谢!我一定很累

08-24 20:02