繁体   English   中英

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

[英]How do I calculate a multiple factorial using num_bigint in Rust?

我正在尝试使用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

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

要解决此问题,您应该使您的factorial function通用,然后只允许那些对您的特定方法有意义的类型。

我举了你的例子并将其扩展为允许所有未签名的 integer 类型:

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, NumCast, 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)));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM