微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Rust 中使用 num_bigint 计算多重阶乘?

如何解决如何在 Rust 中使用 num_bigint 计算多重阶乘?

我正在尝试使用 Num-BigInt 库计算 Rust 中阶乘的阶乘。我已经到了可以计算阶乘的地步了:

use num_bigint::BigUint;
use num_traits::{One,Zero,FromPrimitive};

fn factorial(n: usize) -> BigUint {
    let mut f: BigUint = One::one();
    for i in 1..(n+1) {
        let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
        f = f * bu;
    }
    f
}

pub fn main() {
    println!("Starting calculation...");
    println!("{}",factorial(5));
}

我想做一个双阶乘,比如:

pub fn main() {
    println!("Starting calculation...");
    println!("{}",factorial(factorial(5))); 
}

但是,由于数据类型不同,这会引发以下错误

error[E0308]: mismatched types
  --> src/main.rs:16:30
   |
16 |     println!("{}",factorial(factorial(5)));
   |                              ^^^^^^^^^^^^ expected `usize`,found struct `BigUint`

如何使用 BigUint 而不是 usize 重复此函数

解决方法

问题是您首先要使用 usize,然后使用 BigUint 作为函数参数,而您的参数设置为 usize

要解决此问题,您应该让 factorial 函数 generic,然后只允许那些对您的特定方法有意义的类型。

我采用了您的示例并将其扩展为允许所有无符号整数类型:

use num_bigint::BigUint;
use num_traits::{One,FromPrimitive,Unsigned};
use num::{Integer,NumCast,ToPrimitive};

fn factorial<N: Unsigned + Integer + ToPrimitive>(n: N) -> BigUint {
    let mut f: BigUint = One::one();
    let end: usize = NumCast::from(n).unwrap();
    for i in 1..(end + 1) {
        let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
        f = f * bu;
    }
    f
}

pub fn main() {
    println!("Starting calculation...");
    println!("{}",factorial(factorial(5 as u32)));
}

然而,这将导致不允许 factorial(5),因为默认情况下 5 被视为可以签名的 i32。如果您希望允许签名类型而不是在运行时失败,您可以执行以下操作:

use num_bigint::BigUint;
use num_traits::{One,FromPrimitive};
use num::{Integer,ToPrimitive};

fn factorial<N: Integer + ToPrimitive>(n: N) -> BigUint {
    let mut f: BigUint = One::one();
    let end: usize = NumCast::from(n).expect("Number too big or negative number used.");
    for i in 1..(end + 1) {
        let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
        f = f * bu;
    }
    f
}

pub fn main() {
    println!("Starting calculation...");
    println!("{}",factorial(factorial(5)));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。