从Java翻译成R的代码中的函数调用堆栈问题
我将Java代码翻译成了R。我需要检查是否所有行都翻译正确 有些部分很可能是正确的,因为我运行了它,R说: 错误:C堆栈使用量7970192太接近限制 我不确定哪一部分出错了,因为当我编译它时,它不会显示所有行的任何错误,除非我尝试运行它 原始Java代码:从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 (
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 * *