问题是:现代数学的一个着名证明是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
Run Code Online (Sandbox Code Playgroud)
在上图中,第一项是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]
Run Code Online (Sandbox Code Playgroud)
所以,你能告诉我为什么我错了吗?
我想你需要阅读一些Haskell.你误解了一些基本的语法.
首先,case像这样工作.
case expression of
pat1 -> expr1
pat2 -> expr2
...
case someBool of
True -> 1
False -> 2
Run Code Online (Sandbox Code Playgroud)
接下来是if.
if someBool then expr1 else expr2
Run Code Online (Sandbox Code Playgroud)
该else是不可选的.
if True then 1 else 2
Run Code Online (Sandbox Code Playgroud)
接下来, let
let pat1 = expr1
pat2 = expr2
...
in expr
let foo = 1
bar = 2
in foo + bar
Run Code Online (Sandbox Code Playgroud)
最后, do
do
someExpr
let pat = expr
pat <- someExpr
do
putStrLn "Hello World"
let x = 1
myLine <- getLine
Run Code Online (Sandbox Code Playgroud)
现在,一旦你弄清楚了一些语法,你应该能够修复你的代码.
编辑:
Haskell中的变量是不可变的,foo = bar在do块中写入不会改变它.这只是一个语法错误,你的代码中有几个.