问题是:现代数学的著名证明之一是 Georg Cantor 证明有理数集是可枚举的。该证明通过使用有理数的显式枚举来工作,如下图所示。
1/1 1/2 1/3 1/4 1/5 ...
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1
在上图中,第一项为 1/1,第二项为 1/2,第三项为 2/1,第四项为 3/1,第五项为 2/2,以此类推。
您将编写一个程序,该程序将读取 1 到 107 范围内的数字列表,并为每个数字打印 Cantor 枚举中的相应项,如下所示。最后一个数字后不应出现空行。输入列表每行包含一个数字,并将在文件结束时终止。输入文件中不会出现超过 30 个数字。
我写的代码是:
stepOver = do [left num den dir]
count <- getLine
let left = count' -1
if left == 0
then putStrLn [num den]
let newleft = left -1
case (stepOver num) of
1 -> if dir == up
stepOver = [newleft 1 (den + 1) down]
stepOver = [newleft 2 (den - 1) down]
case (stepOver den) of
1 -> if dir == down
stepOver = [newleft (num + 1) 1 down]
stepOver = [newleft (num - 1) 2 down]
case (stepOver dir) of
up -> stepOver = [newleft (num - 1) (den + 1) dir]
case (stepOver dir) of
down -> stepOver = [newleft (num + 1) (den - 1) dir]
所以,你能告诉我为什么我错了吗?