我在Rust中实现了worstsort:
fn bubblesort<T: PartialOrd>(l: &mut [T]) {
for i in 1..l.len() {
for j in 0..l.len() - i {
if l[j + 1] < l[j] {
l.swap(j + 1, j);
}
}
}
}
fn permutations<T: Clone>(l: &[T]) -> Vec<Vec<T>> {
if l.len() <= 1 {
return vec![l.to_vec()];
}
let mut res = Vec::new();
for i in 0..l.len() {
let mut lcopy = l.to_vec();
lcopy.remove(i);
let p = permutations(&lcopy);
for perm in p {
let mut fullperm = vec![l[i].clone()];
fullperm.extend(perm);
res.push(fullperm);
}
}
res
}
pub fn badsort<T: PartialOrd + Clone>(k: usize, l: &mut [T]) {
if k == 0 {
bubblesort(l);
} else {
let mut p = permutations(l);
badsort(k - 1, &mut p);
l.clone_from_slice(&p[0]);
}
}
pub fn worstsort<T, F>(l: &mut [T], f: F)
where
T: PartialOrd + Clone,
F: FnOnce(usize) -> usize,
{
badsort(f(l.len()), l);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn badsort_zero() {
let mut unsorted = vec![8, 3, 5];
badsort(0, &mut unsorted);
assert_eq!(unsorted, vec![3, 5, 8]);
}
#[test]
fn worstsort_id() {
let mut unsorted = vec![8, 3, 5];
worstsort(&mut unsorted, |n| n);
assert_eq!(unsorted, vec![3, 5, 8]);
}
}
它会编译并检查正常,直到我尝试编写实际调用worstsort
和badsort
函数的测试,而cargo test
给出错误:
error: reached the recursion limit while instantiating `badsort::<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<i32>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
即使在调用badsort(0, l)
时也出现此错误,该badsort
应该只是bubbleort,没有任何递归调用。我的假设是rustc试图为每个可能的usize
生成u8
的单态版本(我将类型换成#![recursion_limit="1024"]
并得到了相同的错误),但是我不明白为什么:无论参数是什么,即使它根本没有递归地调用自身,它也会出错!我尝试将递归限制一直设置到u8
,但即使达到 while(1){
boost::mutes::scoped_lock locker(mtx);
std::cout << "A" << std::endl;
// do stuff with Matrix
std::cout << "B" << std::endl;
mtx.unlock();
//wait for few microseconds
}
,它仍然会达到此限制并失败。
我的猜测正确吗?有没有办法让这个(公认是错误的)代码编译并完全运行?