u64 { let divs = divisors(1, -6ren">
gpt4 book ai didi

recursion - 有没有办法优化这段代码,使其不会溢出堆栈?

转载 作者:行者123 更新时间:2023-11-29 08:04:01 24 4
gpt4 key购买 nike

我正在研究第三个欧拉计划问题:

fn main() {
println!("{}", p3());
}

fn p3() -> u64 {
let divs = divisors(1, 600851475143, vec![]);
let mut max = 0;
for x in divs {
if prime(x, 0, false) && x > max {
max = x
}
}
max
}

fn divisors(i: u64, n: u64, div: Vec<u64>) -> Vec<u64> {
let mut temp = div;
if i * i > n {
temp
} else {
if n % i == 0 {
temp.push(i);
temp.push(n / i);
}
divisors(i + 2, n, temp)
}
}

fn prime(n: u64, i: u64, skip: bool) -> bool {
if !skip {
if n == 2 || n == 3 {
true
} else if n % 3 == 0 || n % 2 == 0 {
false
} else {
prime(n, 5, true)
}
} else {
if i * i > n {
true
} else if n % i == 0 || n % (i + 2) == 0 {
false
} else {
prime(n, i + 6, true)
}
}
}

600851475143 是在某个时刻导致它溢出的值。如果我将其替换为 1010 数量级或更小的任何值,它会返回一个答案。在将其保留为递归解决方案的同时,有没有办法:

  1. 增加筹码量?
  2. 优化我的代码,使其不返回fatal runtime: stack overflow 错误?

我知道这可以迭代完成,但我不想那样做。

最佳答案

包含 600 * 109 u64 的向量意味着您将需要 4.8 TB 的 RAM 或交换空间。

我敢肯定,对于这个问题,您不需要它,您在这里缺少一些数学知识:扫描到 600851475143 的平方根就足够了。您也可以使用 Sieve of Eratosthenes 来加速程序。 .

Project Euler 可以很好地提高您的数学技能,但它不能特别帮助您学习任何编程语言。为了学习 Rust,我从 Exercism 开始.

关于recursion - 有没有办法优化这段代码,使其不会溢出堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com