小编201*_*ion的帖子

是否可以在Rust的编译时计算一个递归函数?

我想计算一个的阶乘const。我想结束这样的事情:

const N: usize = 4;
const N_PERMUTATIONS = factorial(N);
Run Code Online (Sandbox Code Playgroud)

显而易见的解决方案(不起作用)是:

  • const fn–不允许(或至少不实施)条件语句const fn,以下任何一种都不会编译:

    const fn factorial(n: usize) -> usize {
        match n {
            0 => 1,
            _ => n * factorial(n-1)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
    const fn factorial(n: usize) -> usize {
        if n == 0 {
            1
        } else {
            n * factorial(n-1)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 宏–在所有宏扩展之后执行表达式的评估。此宏将永远不会达到基本情况,因为经过四次迭代后,参数为4-1-1-1-1,与以下参数不匹配0

    macro_rules!factorial {
        (0) => (1);
        ($n:expr) => ($n * factorial($n-1));
    }
    
    Run Code Online (Sandbox Code Playgroud)

我还尝试了以下方法,如果*进行了短路评估,该方法将起作用,但是按原样进行无条件递归会导致堆栈溢出:

const …
Run Code Online (Sandbox Code Playgroud)

macros recursion const compile-time-constant rust

6
推荐指数
1
解决办法
477
查看次数

标签 统计

compile-time-constant ×1

const ×1

macros ×1

recursion ×1

rust ×1