2013-09-27 68 views
1

我想解決一個問題不能超出循環塊

Rahul正在玩一個非常有趣的遊戲。他有N個磁盤(每個磁盤的半徑相等)。 每個磁盤都有與其關聯的1到N中不同的數字。磁盤被放置在一堆之上。

Rahul想要按照從上到下的順序對這堆磁盤進行排序。但他有一個非常非常特殊的方法來做到這一點。在一個步驟中,他只能從一堆盤中選擇一張盤,而他只能將其放在最上面。

Rahul希望用盡可能少的步驟對他的一堆磁盤進行分類。所以幫助拉胡爾這樣做。因此,不必顯示實際步驟,只需回答可能的最小步驟數就可以分類,以便Rahul可以檢查他是否正在做對或錯的工作。

代碼我寫是

sub get_order { 
    my (@input1)= @_; 
    my @input2 = @input1; 

    my $count = 0; 
    sub recursive { 
     my $max = 0; 
     last if ($#input2 == -1) ; 
     foreach (0 .. $#input2) { 
      $max = $max > $input2[$_] ? $max : $input2[$_]; 
      print " maximum is $max \n"; 
     } 
     if ($max == $input2[$max-1]) { 
      $abc = 0; 
     } else { 
      $count++; 
      #push @input2, $max; 
     } 
     # deleting that particular array index from the array 
     my %hash = map { 
      $_ => "1" 
     } @input2; 
     delete $hash{$max}; 
     print %hash; 
     print "\n"; 
     @input2 = keys %hash; 
     print "***@input2 \n"; 
     &recursive(); 
    } 
    &recursive(); 
    print "value is $count \n"; 
    return $count; 

} 

get_order(3,1,2); 

我在test.txt的線得到一個錯誤不能「最後」一個循環塊之外8.

+2

看起來你」重新嘗試解決河內塔問題:http://hop.perl.plover.com/book/pdf/01RecursionAndCallbacks.pdf – Zaid

+0

@Zaid:我從論壇「techgig」得到這些問題。想到解決這個問題。 :) – Nitesh

+1

你應該避免嵌套子程序。最好使用匿名子例程。 –

回答

4

forforeachwhileuntil,或裸塊,你不能使用lastnextredo

相反,你可以從return功能,

return if ($#input2 == -1) ; 
+1

它不限於'for'和'while' - 你可以從一個裸循環中'持續':'perl -Mstrict -wE'{持續;說「測試」; }'' – Zaid

+0

@Zaid:這是什麼意思perl -Mstrict -wE'{last;說「測試」; }' – Nitesh

+0

哪部分你不明白? – ikegami

3

部分代碼是

sub recursive { 
    my $max = 0; 
    last if ($#input2 == -1) ; 
    foreach (0 .. $#input2) { 

在這些行中lastfor循環內不會發生。因此錯誤信息。

last用於退出循環。如果您想退出sub,請使用return

+0

僅適用於for/while循環? – Nitesh

+2

所有循環語句(while,iterative,foreach,C-style和bare) – ikegami