## Compile-Time Recursion Limit Reached

### Issue

You see a message such as:

```Compile-time recursion limit reached. Size or type of input #1 of function 'foo' may change at every call.```
```Compile-time recursion limit reached. Value of input #1 of function 'foo' may change at every call.```

### Cause

With compile-time recursion, the code generator produces multiple versions of the recursive function instead of producing a recursive function in the generated code. These versions are known as function specializations. The code generator is unable to use compile-time recursion for a recursive function in your MATLAB® code because the number of function specializations exceeds the limit.

### Solutions

To address the issue, try one of these solutions:

### Force Run-Time Recursion

• For this message:

```Compile-time recursion limit reached. Value of input #1 of function 'foo' may change at every call.```

Use this solution:

• For this message:

```Compile-time recursion limit reached. Size or type of input #1 of function 'foo' may change at every call.```

In the code generation report, look at the function specializations. If you can see that the size of an argument is changing for each function specialization, then try this solution:

#### Force Run-Time Recursion by Treating the Input Value as Nonconstant

Consider this function:

```function y = call_recfcn(n) A = ones(1,n); x = 100; y = recfcn(A,x); end function y = recfcn(A,x) if size(A,2) == 1 || x == 1 y = A(1); else y = A(1)+recfcn(A(2:end),x-1); end end ```

The second input to `recfcn` has the constant value 100. The code generator determines that the number of recursive calls is finite and tries to produce 100 copies of `recfcn`. This number of specializations exceeds the compile-time recursion limit. To force run-time recursion, instruct the code generator to treat the second input as a nonconstant value by using `coder.ignoreConst`.

```function y = call_recfcn(n) A = ones(1,n); x = coder.ignoreConst(100); y = recfcn(A,x); end function y = recfcn(A,x) if size(A,2) == 1 || x == 1 y = A(1); else y = A(1)+recfcn(A(2:end),x-1); end end ```

If the code generator cannot determine that the number of recursive calls is finite, it produces a run-time recursive function.

#### Force Run-Time Recursion by Making the Input Variable-Size

Consider this function:

```function z = call_mysum(A) %#codegen z = mysum(A); end function y = mysum(A) coder.inline('never'); if size(A,2) == 1 y = A(1); else y = A(1)+ mysum(A(2:end)); end end```

If the input to `mysum` is fixed-size, the code generator uses compile-time recursion. If `A` is large enough, the number of function specializations exceeds the compile-time limit. To cause the code generator to use run-time conversion, make the input to `mysum` variable-size by using `coder.varsize`.

```function z = call_mysum(A) %#codegen B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) == 1 y = A(1); else y = A(1)+ mysum(A(2:end)); end end```

### Increase the Compile-Time Recursion Limit

The default compile-time recursion limit of 50 is large enough for most recursive functions that require compile-time recursion. Usually, increasing the limit does not fix the issue. However, if you can determine the number of recursive calls and you want compile-time recursion, increase the limit. For example, consider this function:

```function z = call_mysum() %#codegen B = 1:125; z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) == 1 y = A(1); else y = A(1)+ mysum(A(2:end)); end end```

You can determine that the code generator produces 125 copies of the `mysum` function. In this case, if you want compile-time recursion, increase the compile-time recursion limit to 125.

To increase the compile-time recursion limit:

• At the command line, in a code generation configuration object, increase the value of the `CompileTimeRecursionLimit` configuration parameter.

• In the MATLAB Coder™ app, increase the value of the Compile-time recursion limit setting.

## Support Get trial now