algorithm - 为什么我的递归归并排序算法会导致堆栈溢出?
问题描述
实现归并排序时的递归调用会引发错误。我尝试使用调试宏来查看它是否有一些内存限制而没有运气。
fn merge<T: PartialOrd>(mut v: Vec<T>) -> Vec<T> {
if v.len() < 1 {
return v;
}
let mut res = Vec::with_capacity(v.len());
let b = v.split_off(v.len() / 2);
let a = merge(v);
let b = merge(b);
let mut a_it = a.into_iter();
let mut b_it = b.into_iter();
let mut a_curr = a_it.next();
let mut b_curr = b_it.next();
loop {
match a_curr {
Some(ref a_val) => match b_curr {
Some(ref b_val) => {
if a_val < b_val {
res.push(a_curr.take().unwrap());
a_curr = a_it.next()
} else {
res.push(b_curr.take().unwrap());
b_curr = b_it.next();
}
}
None => {
res.push(a_curr.take().unwrap());
res.extend(a_it);
return res;
}
},
None => {
if let Some(b_val) = b_curr {
res.push(b_val)
}
res.extend(b_it);
return res;
}
}
}
}
fn main() {
let v = vec![9, 7, 4, 6, 5, 2, 1, 11];
let x = merge(v);
println!("{:?}", x);
}
thread 'main' has overflowed its stack
error: process didn't exit successfully: `target\debug\tescode.exe` (exit code: 0xc00000fd, STATUS_STACK_OVERFLOW)
解决方案
您有堆栈溢出,因为您执行了无限数量的递归调用。这是由于您的退出标准不正确造成的;改用小于或等于:
if v.len() <= 1 {
return v;
}
推荐阅读
- python - 理解 h 指数计算的术语
- spring - 如何使用 Spring 消息传递 RSocket @ConnectMapping 解析身份验证参数
- amazon-web-services - 具有两个负载均衡器的 AWS CodeDeploy(蓝/绿)部署组
- here-api - HERE 车队远程信息处理。例子。汽车拖车的错误?
- php - 工匠测试命令不起作用,laravel 7.x
- c# - 如何获取程序的当前文件夹名称并将zip文件解压缩到C#中的当前文件夹?
- javascript - 从两个链接打开 ant design popover
- flutter - 导致布局问题的列小部件
- r - R GGally::ggpairs,相关矩阵图,如何自定义诊断
- php - Redis 键名与 laravel 中定义的名称不匹配