2017-05-31 53 views
0

我试图在Perl中编写8皇后问题,我似乎遇到了无法修复的无限循环。我认为问题在于女王增量,因为当我打印“$女王”时;在我的求解函数中,我得到的是一堆1。我的Perl程序有一个无限循环(8皇后)

# 
# implement 8 queen problem 
# 

my $size = 8; 
my @answer =(); 

sub is_conflict($$){ 
    my ($row, $queen) = @_; 

    for(my $i=0; $i<$queen; $i=$i+1){ 
     my $temp = $answer[$i]; 
     if (($temp eq $row) or      #same row 
      ($temp eq ($row - ($queen - $i))) or #same diagonal 
      ($temp eq ($row + ($queen-$i)))){  #same diagonal 
      return 1; #return true 
     } 
    } 
    return 0; #return false 
} 

sub solve($){ 
    my $queen = @_; 

    if($queen eq $size){ 
     print "@answer\n"; 
     @answer =(); 
    } 
    else{ 
     for(my $i=0; $i<$size; $i=$i+1){ 
      if(is_conflict($i,$queen) eq 0){ 
       push(@answer, $i); 
       solve($queen+1); 
      } 
     } 
    } 
} 

solve(0); 
+1

一个另外:不要使用原型。他们不会做你认为他们做的事。失去'($)'。 – Sobrique

回答

3

my $queen = @_几乎肯定不是你的意思。

my $var = @_evaluates @_ in scalar context,给你的尺寸为@_而不是@_的第一个元素。在您的程序中,您始终将值1分配到$queen

相反,你想说的

my ($queen) = @_;  # list context, assigns first element of @_ 
my $queen = shift @_; # extract first element from @_ 
my $queen = shift; # inside a sub, same as shift @_ 
+0

所以我假设我的$ queen = @_只是传入变量。现在我没有一个无限循环,但我的程序仍然没有打印出任何东西。 –