2016-04-03 15 views
1

Aşağıdaki algoritmalara sahibim: Amaç, işaretler arasında geçiş yapabilmeleri için bir dizi sayının tüm olası permütasyonlarını bulmaktır. Ağaçta bir yaprak düğümüne ulaştığında, bu permütasyonun toplamının serideki bir sayıya eşit olup olmadığını görmek için bir liste üzerinde yinelenen başka bir yöntemi çağırır. Ayrıca, bir dizinin bir alt kümesinin belirli bir sayıdan daha az olup olmadığını görmek için bir algoritma ile uğraşıyorum. Örneğin 60, 35 ve 40 sayıları, 60 + 40 < 110. Sorunum, ağacın bir dalının diğer dallara ihtiyaç duyduğumda bulunması halinde hala keşfedilebileceğidir. Bunu nasıl kesebilirim? Şu anda sahip olduğum her bir system.exit(1);Bir değeri çalıştırmadan önce döndürmek için nasıl bir özyinelemeli algoritma alabilirim?

public static int PlusMinus(Node start, Node node, int Sum){ 
    Node head = start; 
    boolean Success = false; 
    if(node != null){ 
     PlusMinus(head, node.next, node.item+Sum); 
     PlusMinus(head, node.next, node.item*(-1)+Sum); 
     return Sum; 
    } 

    else{ 
     Success = getSum(Sum,start); 
     if(Success == true){ 
      System.out.println("Yes"); 
      System.exit(1); 
      return 1; 
     } 
    } 
    return 0; 
} 

yukarıda bakıldığında ise, benim asıl niyeti bu çağıran programa yaprak düğüm toplamını iade sahip olmaktı. Anladığım kadarıyla, programa adım atmaktan, eğer en sağdaki dal, doğru permütasyon ise, bu sadece yaprak düğüm dönüş değeriyle bitmeyecektir. Yine de ebeveyne geri dönecek ve ardından bir sonraki şubeyi test etmeye devam edecek.

+0

Toplamı iade etme ve bu iki yöntemi çağırmanın amacı nedir? – Natecat

+0

Hiçbir zaman kontrol akışı için 'System.exit()' kullanmayın. Bu çok kötü bir tasarım. Kullanıcı, bu yöntemin bir değer döndürmesini bekler, ancak tüm JVM'yi durduramayacaktır. –

cevap

1

Dönüş değeriniz, aradığınız toplamı bulup bulamadığınızı gösteren bir boole olmalıdır. Yöntemeniz tarafından döndürülen mevcut değeri kullanmadığınız için, ona ihtiyacınız olmadığı anlaşılıyor.

public static boolean PlusMinus(Node start, Node node, int Sum){ 
    Node head = start; 
    if(node != null) { 
     // you should return true if either of the recursive calls returned true 
     if (PlusMinus(head, node.next, node.item+Sum)) 
      return true; 
     return PlusMinus(head, node.next, node.item*(-1)+Sum); 
    } else { 
     return getSum(Sum,start); 
    } 
} 

DÜZENLEME:

Ben senin getSum yöntem ne yaptığını bilmiyorum, ama bunu ihtiyacın yokmuş gibi görünüyor. Geçerli düğümün toplamda katılması gereken işarete bağlı olarak Sum-node.item veya Sum+node.item numaralı sonraki özyinelemeli çağrıya geçmeli ve bir yaprak düğümüne ulaştığınızda 0'a ulaşıp ulaşmadığınızı kontrol etmelisiniz.

public static boolean PlusMinus(Node start, Node node, int Sum){ 
    if(node != null) { 
     // you should return true if either of the recursive calls returned true 
     if (PlusMinus(head, node.next, Sum - node.item)) 
      return true; 
     return PlusMinus(head, node.next, Sum + node.item); 
    } else { 
     return Sum == 0; 
    } 
} 
+1

Sonunda 'false döndür 'gereksizdir. –

+0

@Psioniax Kodda bir düzeltme yaptım ve artık gereksiz. – Eran

İlgili konular