#2 楼 @luikore 你这个解有错误,box 这个函数只包含了一个块内对角线三个元素的下标。
另外这行代码
ds.find {|d| a[x] = d; return r if (r = f x, a) }
的逻辑有问题吧,if (r = f x, a) 永远都是真,那么程序并不会尝试 ds 里面所有的值,每次都是尝试了第一个就返回了。 而且在 block 中加 return 语句的写法也太诡异了。。。
关于 list comprehension,这里例子可能还不是很典型,之前见过这样一个例子挺好的: 在每条边都小于 100 的三角形中,找出所有直角三角形,并列出三条边的长度
[(a,b,c) | a<-[1..100],b<-[1..a],c<[1..b],c^2+b^2==a^2]
map 加 filter 搞不定 list comprehension 哦,起码要先来个笛卡尔积。