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

Math 如何在Rust中使用num_bigint计算多重阶乘?,math,rust,Math,Rust,我正在尝试使用库计算Rust中阶乘的阶乘。我已经到了可以计算阶乘的地步: 使用num_bigint::BigUint; 使用num_traits::{1,零,FromPrimitive}; fn阶乘(n:usize)->BigUint{ 设mut f:BigUint=One::One(); 对于1中的i…(n+1){ 让bu:BigUint=FromPrimitive::from_usize(i).unwrap(); f=f*bu; } F } pub fn main(){ println!(“

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

使用num_bigint::BigUint;
使用num_traits::{1,零,FromPrimitive};
fn阶乘(n:usize)->BigUint{
设mut f:BigUint=One::One();
对于1中的i…(n+1){
让bu:BigUint=FromPrimitive::from_usize(i).unwrap();
f=f*bu;
}
F
}
pub fn main(){
println!(“开始计算…”);
println!(“{}”,阶乘(5));
}
我想做一个双阶乘,比如:

pub fn main(){
println!(“开始计算…”);
println!(“{}”,阶乘(阶乘(5));
}
但是,这会引发以下错误,因为数据类型不同:

错误[E0308]:类型不匹配
-->src/main.rs:16:30
|
16 | println!(“{}”,阶乘(阶乘(5));
|^^^^^^^^^^^^^应为“usize”,找到结构“BigUint”`

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

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

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

我以您的示例为例,对其进行了扩展,以允许所有无符号整数类型:

使用num_bigint::BigUint;
使用num_traits::{1,FromPrimitive,Unsigned};
使用num::{Integer,NumCast,ToPrimitive};
fn阶乘(n:n)->BigUint{
设mut f:BigUint=One::One();
让结束:usize=NumCast::from(n).unwrap();
对于1中的i…(结束+1){
让bu:BigUint=FromPrimitive::from_usize(i).unwrap();
f=f*bu;
}
F
}
pub fn main(){
println!(“开始计算…”);
println!(“{}”,阶乘(阶乘(5为u32));
}
但是,这将导致不允许
factorial(5)
,因为
5
在默认情况下被视为可以签名的
i32
。如果您希望允许签名类型,而不是在运行时失败,则可以执行以下操作:

使用num_bigint::BigUint;
使用num_traits::{One,FromPrimitive};
使用num::{Integer,NumCast,ToPrimitive};
fn阶乘(n:n)->BigUint{
设mut f:BigUint=One::One();
让结束:usize=NumCast::from(n).expect(“数字太大或使用了负数”);
对于1中的i…(结束+1){
让bu:BigUint=FromPrimitive::from_usize(i).unwrap();
f=f*bu;
}
F
}
pub fn main(){
println!(“开始计算…”);
println!(“{}”,阶乘(阶乘(5));
}

您的函数采用
usize
。如果你想让它成为一个大人物,那么唯一阻止你的就是你自己。换一种就行了signature@SilvioMayolo问题是BigUint不允许直接进行添加等操作,不像
usize
虽然我个人对库不熟悉,但粗略地看一下源代码就可以正确地实现。很难回答您的问题,因为它没有包含。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢@西尔维奥马约洛:当
n
BigUint
时,可能问题在于范围
1..(n+1)
?不过,这是可以改写的。