F# 无限阿姆斯壮数字流
F# infinite stream of armstrong numbers
我正在尝试在 F# 中创建一个包含 armstrong 数字的无限流。阿姆斯壮数是其数字的立方加起来等于该数的数。例如,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);;
现在,当我执行 take 4 armstrongs;;
(或任何小于 4 的数字)时,它会完美运行并给出 [1;153;370;371],但如果我执行 take 5 armstrongs;;
,则什么也不会发生, 好像程序卡住了。
我认为问题在于 407 之后没有数字是它们的立方之和(请参阅 http://oeis.org/A046197),但是当您的代码计算 take 1 (Cons(407, filter checkarmstrong (upfrom 408)))
的等价物时,它会强制执行尾部和过滤器的评估将永远递归,永远找不到匹配的下一个元素。另请注意,您对阿姆斯特朗数字的定义不同于维基百科的定义,维基百科指出数字的幂应该是数字中的位数。
我正在尝试在 F# 中创建一个包含 armstrong 数字的无限流。阿姆斯壮数是其数字的立方加起来等于该数的数。例如,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);;
现在,当我执行 take 4 armstrongs;;
(或任何小于 4 的数字)时,它会完美运行并给出 [1;153;370;371],但如果我执行 take 5 armstrongs;;
,则什么也不会发生, 好像程序卡住了。
我认为问题在于 407 之后没有数字是它们的立方之和(请参阅 http://oeis.org/A046197),但是当您的代码计算 take 1 (Cons(407, filter checkarmstrong (upfrom 408)))
的等价物时,它会强制执行尾部和过滤器的评估将永远递归,永远找不到匹配的下一个元素。另请注意,您对阿姆斯特朗数字的定义不同于维基百科的定义,维基百科指出数字的幂应该是数字中的位数。