Recursion 返回向量的递归函数

Recursion 返回向量的递归函数,recursion,rust,flatten,Recursion,Rust,Flatten,我继续与递归的概念作斗争。我有一个函数,它接受一个u64,并返回该整数因子的Vec。我想对Vec中的每个项递归调用此函数,返回一个展平的Vec,直到函数为每个项返回Vec,即每个项都是素数 fn prime_factors(x: u64) -> Vec<u64> { let factors = factoring_method(x); factors.iter().flat_map(|&i| factoring_method(i)).collect()

我继续与递归的概念作斗争。我有一个函数,它接受一个
u64
,并返回该整数因子的
Vec
。我想对
Vec
中的每个项递归调用此函数,返回一个展平的
Vec
,直到函数为每个项返回
Vec
,即每个项都是素数

fn prime_factors(x: u64) -> Vec<u64> {
    let factors = factoring_method(x);
    factors.iter().flat_map(|&i| factoring_method(i)).collect()
}
fn素数因子(x:u64)->Vec{
设因子=因子分解法(x);
factors.iter().flat|u映射(|和i|factoring_方法(i)).collect()
}
()

它只返回最终迭代因子的
Vec
,并且没有条件允许它继续运行,直到所有项都是素数


factoring\u方法
是一种我非常满意的平方同余。我肯定还有很多优化的空间,但我希望在重构之前完成一个工作版本。我认为递归应该在平方的
同余中,调用它返回的
Vec
的每个成员,但我不确定如何构造条件以防止它无限地这样做。

有用的递归需要两件事:

  • 函数直接或间接地调用自身
  • 有一些终止案例
  • 数的素因式分解的一个定义是:

    • 如果这个数是素数,那就是唯一的素数因子
    • 否则,将一对数的因子的素数因子组合起来
    由此,我们可以识别终止条件(“如果它是素数”)和递归调用(“素数因子”)

    请注意,我们还没有编写任何代码-到目前为止,一切都是概念性的

    然后我们可以把这个想法转录成Rust:

    fn prime_factors(x: u64) -> Vec<u64> {
        if is_prime(x) {
            vec![x]
        } else {
            factors(x).into_iter().flat_map(prime_factors).collect()
        }
    }
    

    事实上,如果没有
    分解方法
    ,很难回答这个问题。请提供一个“
    factoring\u method
    prime\u factors
    应该是同一个函数吗?@sellibitze--不,factoring method是独立的,您遇到了Shepmaster指出的相同概念问题。我很抱歉没有用E_net4要求的代码更新问题。我病了几天了。今晚我将尝试更新以澄清问题。
    正方形的一致性(9)
    返回
    [1,9]
    @Shepmaster为什么不返回?小于或等于9的正方形仅为4和9。4不是9的因子,因此它应该返回9及其互补因子1。
    fn is_prime(x: u64) -> bool {
        !(2..x).any(|i| x % i == 0)
    }
    
    fn factors(x: u64) -> Vec<u64> {
        match (2..x).filter(|i| x % i == 0).next() {
            Some(v) => vec![v, x / v],
            None => vec![],
        }
    }