【问题标题】:My perl program has an infinite loop (8 queen)我的 perl 程序有一个无限循环(8 个皇后)
【发布时间】:2017-05-31 13:01:44
【问题描述】:

我正在尝试在 perl 中编写 8 Queen 问题,但我似乎遇到了无法修复的无限循环。我认为问题出在皇后增量上,因为当我打印“$queen”时;在我的求解函数中,我得到的只是一堆 1。

#
# 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);

【问题讨论】:

  • 另外:不要使用原型。他们不会做你认为他们会做的事。丢失($)

标签: perl


【解决方案1】:

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 @_

【讨论】:

  • 所以我假设我的 $queen = @_ 只是在传递变量。现在我没有无限循环,但我的程序仍然没有打印出任何东西。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2014-11-10
  • 2014-01-04
相关资源
最近更新 更多