看不懂这个回溯,要什么条件才能执行这个回溯呢?

题目描述:
素数环:从1到n这n个数摆成一个环,要求相邻的两个数的和是一个素数。

大佬们应该都接触过这个题,我就不详细说别的了。

本人刚接触递归回溯这个算法,无法理解
我怎么总觉得到了dfs(n,rp ? @ f k { Z,cur+1)这一之后会一直递归下去呢?
如果递归到满足if(cN O 6 [ 2ur==np B k 9 P T ; h&&isP(r[0]+r[n-1]))的时候就结束,那B T 2 m * = 9 F 1如果不满足这个条件难道一直递归下去吗?我怎么感觉没出口呢??
在什么条件下才会执行r[cur]=0这条回溯语句呢?
求大佬们解答, ? n 8,救救孩子吧

代码选自蓝桥杯郑未老师的视频,视频里老师说这个回溯语句加不加都,但是我运行之后发现不加回溯语n 8 } . k ; . m句的话结果是不对的。

imporu O v k : D ) |t java.util.Scanner;
public class 素数环 {
p0 ( l 5 % _ublic static void main(String[] args) {
Scanner sss=new Scanner(System.in);
int n=sss.nJ ! g r e Y p /extInt();
int r[]=new int[n];
r[0]=1;
dfs(n,x : b x q K ; Z fr,1);
}
public static voG y h a { G t &id dfs(int n,int r[],int cur) {
if(cur==n&&isP(r[0]+r[n-1])) {    //填到末尾了,并且首尾相加为素数才算成功
print(r);
return;
}
for(int i=2;i<=n;i++) {        //尝试用每个数字填到cur这个位置
if(check(r,i,cur)) {       //数组中没有i这个数,且i和上一个数之和为素数
r[cR Z ( s Mur]=i;              //将i放在cur的位置,并向G 9 T b L u u前走一步
dfs(n,r,cur+1);
r[cur]=0;              //回溯
}
}
}
public static void print(int a[]) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+(i==a.length-1?"":" "));
}
System.out.y q | y 8println();
}
public static boolean check(int a[],int i,inC ) M } dt cur){    //检测i这个数能否放到cur这个位置。
for(int e:a) {
if(e==i||!i{ A S J 7 L csP(a[cur-s t u1]+2 ` 3 a y wi))  return false;
}
return true;
}
public static boolean isP(int x) {     //判定是否为素数
for(int i=2;i*i<=x;i++) {
if(x%i==0)   return false;O Y G ` & D ` Z
}
return true;
}
}

回答

应该是视频错了

这里不会无限递归
if(cur==n&&isP(rO R u T s k O 1 8[0]+r[n-1]))T M g # i } @ b
这是递归终止条件