F# 无限阿姆斯特朗数流

标签 f# stream

我正在尝试在 F# 中创建一个包含阿姆斯特朗数字的无限流。阿姆斯特朗数是其数字的立方加起来等于该数字的数。例如,153 是一个阿姆斯特朗数,因为 1^3 + 5^3 + 3^3 = 153。到目前为止,我已经创建了几个函数来帮助我做到这一点。他们是:

type 'a stream = Cons of 'a * (unit -> 'a stream);;

let rec upfrom n = Cons (n, fun() -> upfrom (n+1));;

let rec toIntArray = function
    | 0 -> []
    | n -> n % 10 :: toIntArray (n / 10);;

 
let rec makearmstrong = function
    | [] -> 0
    | y::ys -> (y * y * y) + makearmstrong ys;;

let checkarmstrong n = n = makearmstrong(toIntArray n);;

let rec take n (Cons(x,xsf)) =
   match n with
   | 0 -> []
   | _ -> x :: take (n-1)(xsf());;

let rec filter p (Cons (x, xsf)) =
    if p x then Cons (x, fun() -> filter p (xsf()))
    else filter p (xsf());;

最后:

 let armstrongs = filter (fun n -> checkarmstrong n)(upfrom 1);;

现在,当我拿4个armstrongs;;(或任何小于4的数字)时,这会完美地工作并给我[1;153;370;371],但是如果我这样做take 5 Armstrongs;;没有任何反应,看起来程序卡住了。

最佳答案

我认为问题在于 407 之后没有数字是其立方之和(请参阅 http://oeis.org/A046197 ),但是当您的代码计算相当于 take 1 (Cons(407, filter checkarmstrong ( upfrom 408))) 它将强制对尾部进行评估,过滤器将永远递归,永远找不到匹配的下一个元素。另请注意,您对阿姆斯特朗数字的定义与维基百科的定义不同,维基百科规定数字的幂应该是数字中的位数。

关于F# 无限阿姆斯特朗数流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068013/

相关文章:

f# - 为什么 F# 有一个一元加号运算符?

constructor - F# 使用构造函数作为函数

generics - 通用 F# 函数 : How to get the Type of an F# Discriminated Union?

c# - 通过我的服务器将文件从远程服务器复制到客户端浏览器,而不将整个文件写入磁盘或内存

ios - 如何通过 RTMP 将视频流式传输到 iOS?

F# Monad 如何修复数据类型

.net - reduce 和 reduceBack 之间有什么区别吗

c++ - 模拟流以进行测试

java - 两个输出流?

javascript - mysql实现流读和流插入