这是一个非常简单的例子,但我将如何做类似的事情:
let fact = |x: u32| {
match x {
0 => 1,
_ => x * fact(x - 1),
}
};
Run Code Online (Sandbox Code Playgroud)
我知道这个具体的例子可以通过迭代轻松完成,但我想知道是否可以在Rust中为更复杂的事情(例如遍历树)创建一个递归函数,或者我是否需要使用我自己的堆栈代替.
我正在研究Project Euler问题40的实现,并且我试图弄清楚如何从Haskell中的列表中取出多个项目而不启动列表.
目前,我有一个champernowne类型列表Integral a => [a],它将返回一个无限的Champernowne常数数字列表,然后我从这个序列中取出第一个,第十个等术语并乘以得到答案.实际代码是:
ans = (product . map (champernowne !!)) [0, 9, 99, 999, 9999, 99999]
Run Code Online (Sandbox Code Playgroud)
这个实现的问题是(我假设)每次想要获得一个新术语时,Haskell将从序列的开头经过列表.我怎样才能使haskell只经历从元素1到1 000 000的序列,然后将这些术语从中间拉出来?我已经尝试过scanl,希望懒惰的评估可以帮助我,但它没有:
ans = (product . head . scanl (flip drop) champernowne) [10, 90, 900, 9000, 90000]
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,第一部分代码确实有效,但我正在努力提高我的实现效率.
假设我有以下C++代码:
struct something
{
// ...
union { int size, length; };
// ...
};
Run Code Online (Sandbox Code Playgroud)
这将创建两个struct访问相同值的成员:size和length.
将两个成员视为完整别名(即设置大小,然后访问长度,反之亦然)是不确定的行为?是否有一种"更好"的方式来实现这种行为,或者这是一种可接受的实现方式?