从Java翻译成R的代码中的函数调用堆栈问题

从Java翻译成R的代码中的函数调用堆栈问题,java,r,backtracking,callstack,code-translation,Java,R,Backtracking,Callstack,Code Translation,我将Java代码翻译成了R。我需要检查是否所有行都翻译正确 有些部分很可能是正确的,因为我运行了它,R说: 错误:C堆栈使用量7970192太接近限制 我不确定哪一部分出错了,因为当我编译它时,它不会显示所有行的任何错误,除非我尝试运行它 原始Java代码: public static void printQueens(int[] q) { int n = q.length; for (int i = 0; i < n; i++) { for (

我将Java代码翻译成了R。我需要检查是否所有行都翻译正确

有些部分很可能是正确的,因为我运行了它,R说:

错误:C堆栈使用量7970192太接近限制

我不确定哪一部分出错了,因为当我编译它时,它不会显示所有行的任何错误,除非我尝试运行它

原始Java代码:

  public static void printQueens(int[] q) {
      int n = q.length;
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
          if (q[i] == j) StdOut.print("Q ");
          else           StdOut.print("* ");
        }
        StdOut.println();
      }  
      StdOut.println();
    }


  /***************************************************************************/

    public static void enumerate(int n) {
      int[] a = new int[n];
      enumerate(a, 0);
    }

  public static void enumerate(int[] q, int k) {
    int n = q.length;
    if (k == n) printQueens(q);
    else {
      for (int i = 0; i < n; i++) {
        q[k] = i;
        if (isConsistent(q, k)) enumerate(q, k+1);
      }
    }
  }  


  public static void main(String[] args) {
    int n = Integer.parseInt(args[0]);
    enumerate(n);
  }

}
publicstaticvoidprintqueens(int[]q){
int n=q.长度;
对于(int i=0;i
R要更正的代码

# Prints n-by-n placement of queens from permutation q
printQueens <- function(q) {
  n = q.length
  for(i in seq_len(n)) {
    for(j in seq_len(n)) {
      if(q[i] == j) print("Q ")
      else{          print("* ")}
    }
    sep="/n"
  }  
  sep="/n"
}

#Try all permutations using backtracking

enumerate <- function(q, k) {
   n = q.length;
   if(k == n) print(Queens(q))
  else {
    for(i in seq_len(n)) {
      q[k] = i
      if (isConsistent(q, k)) enumerate(q, k+1)
    }
  }
}  

enumerate <- function(n) {
  a = n
  enumerate(a);
}

main <- function(args) {
  n =args[0];
  enumerate(n);
}
#从排列q打印皇后的n×n位置
printQueens您指出的错误(堆栈使用)意味着您的代码要么翻译错误(发生了非常深的递归,函数堆栈调用耗尽),要么您可能试图解决非常高的N-queen问题(N>30)

直接将代码从Java翻译为R有许多问题:

  • Java中的数组是从
    0
    索引的,在R中是从
    1
    索引的。您必须在R中重新定义索引函数
    []
  • 然而,For循环在R中有不同的语义。它更像是
    foreach
    功能。要为
  • -R中的循环建模Java
    ,必须在构建时使用
    
    
  • 提供的源代码不完整(
    isConsistent
    函数不存在)
  • 请参阅解决上述所有问题的代码:

    StdOut.print <- cat
    StdOut.println <- function(x) cat("\n")
    index1 <- .Primitive('[')
    `[.zero-based_vector` <- function(v, i) index1(as.vector(v), i+1)
    
    isConsistent <- function(q, n) {
      i <- 0
      while(i < n) {
        if (q[i] == q[n])           
          return(FALSE)   # same column
        if ((q[i] - q[n]) == (n - i)) 
          return(FALSE)   # same major diagonal
        if ((q[n] - q[i]) == (n - i)) 
          return(FALSE)   # same minor diagonal
    
        i <- i + 1
      }
      return(TRUE)
    }
    
    printQueens <- function(q) {
      n <- length(q)
      for (i in seq.int(n) - 1) {
        for (j in seq.int(n) - 1) {
          if (q[i] == j) 
            StdOut.print("Q ")
          else
            StdOut.print("* ")
        }
        StdOut.println()
      }  
      StdOut.println()
    }
    
    enumerate_n <- function(n) {
      a <- integer(n)
      class(a) <- c("zero-based_vector", class(a))
    
        enumerate_qk(a, 0)
    }
    
    enumerate_qk <- function(q, k) {
      n <- length(q)
      if (k == n) {
        printQueens(q)
      } else {
        i <- 0
        while(i < n) {
          q[k + 1] <- i
          if (isConsistent(q, k)) {
            enumerate_qk(q, k + 1)
          }
    
          i <- i + 1
        }
      }
    }  
    
    main <- function(args) {
      n <- as.integer(args[1])
      enumerate_n(n)
    }
    
    main(4)
    
    供参考:

    上发布的完整源代码中,我们似乎缺少了
    isConsistent()
    方法。n皇后问题也是众所周知的。请参阅:编辑有帮助,但错误是什么?@EJoshuaS错误是枚举中的错误(a,0):找不到函数“enumerate”@EJoshuaS错误:中的意外'else':“if(k==n)printQueens(q);else”------------------------------k中的错误:未找到对象'k'
    * Q * * 
    * * * Q 
    Q * * * 
    * * Q * 
    
    * * Q * 
    Q * * * 
    * * * Q 
    * Q * *