2017-01-20 17 views
-1

Почему я получаю ошибку переполнения стека, и я пытаюсь решить эту проблему рекурсивно как начало, до того, как я начните использовать динамическое программирование. В монете метода «a» - это массив, в котором хранятся монеты, которые будут формировать общую сумму, которую я хочу, сумма - это сумма, которую я хочу (17, например), и i представляет собой индекс массива, который i am atfind Количество способов получить общее количество 17 центов (например), используя 1,5,10,25,50 центов

import java.util.*; 
public class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP 
    public static int coins (int [] a, int sum,int i){ 

    if (sum==0) 
     return 1; 
    else if (i==a.length){ 
     return 0; 
    } 
    else if (i>a.length&&sum<a[i]){ 
     return coins(a,sum,i++); 
    } 

    else { 
     return coins(a,sum-a[i],i++)+coins(a,sum-a[i],i); 
    } 
    } 

    public static void main (String [] args){ 
    Scanner sc = new Scanner (System.in); 

    while (sc.hasNext()){ 
     int x = sc.nextInt(); 
     int y=x; 
     int [] a ={1,5,10,25,50}; 
     int w = coins(a,y,0); 
     System.out.println("There are " +w+ " ways to produce "+x + " coins change."); 
    }    
    } 

} 
+1

Это, вероятно, бесконечный рекурсивный вызов, проверьте состояние (код, вы должны найти проблему быстрее нас). Или может быть много рекурсивного вызова, но маловероятно, что вы перегрузите стек. Использование отладки для отслеживания вызовов – AxelH

+0

Это бесконечный рекурсивный вызов. –

+0

Одно слово совета как примечание стороны: вы должны придерживаться одного способа форматирования однострочных утверждений (и я предлагаю всегда использовать фигурные скобки), так как смешение может привести к путанице и трудно обнаружить ошибки. Я имею в виду такие вещи, как ваш первый if-блок, а не else-if-block. – Thomas

ответ

0

У вас возникли проблемы с бесконечной петлей.

Сначала проверьте, что вы хотите вернуть, потому что на самом деле вы можете вернуть только 1 или 0. Итак, где другое условие? Пример: i == a.length - 1 или сумма < 0? Думаю, вы хотите вернуть сумму.

А дальше, если вы поместите пример 17, так где же механизм выбрать монеты ведьмы из массива, который вы можете выбрать?

И дальше, пожалуйста, измените return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i);, потому что в вашем коде я всегда 0

Так, может быть, это хороший код exaple для Вас:

class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP 
    public static int coins (int [] a, int sum,int i){ 
    if (sum==0) 
     return 1; 
    else if (i==a.length){ 
     return 0; 
    }else if(i + 1 == a.length || sum < 0 || sum - a[i] < 0){ //Your break condition ? 
     return sum; 
    } 
    else if (i>a.length&&sum<a[i]){ 
     return coins(a,sum,i++); 
    } 

    else { 
     return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i); 
    } 
    } 
    public static void main (String [] args){ 
    Scanner sc = new Scanner (System.in); 

    while (sc.hasNext()){ 
     int x = sc.nextInt(); 
     int y=x; 
     int [] a ={1,5,10,25,50}; 
     int w = coins(a,y,0); 
     System.out.println("There are " +w+ " ways to produce "+x + " coins change."); 
    } 
    } 
} 
+0

вещь, я не хочу отслеживать, какие монеты я выберу, я просто хочу знать количество способов, которыми я могу объединить эти монеты, чтобы сформировать сумму, которую я имею в основном, когда я вычитаю (sum-a [i]), im уменьшая сумму до тех пор, пока она не достигнет нуля, когда она достигнет нуля, тогда я верну один из двух возможных способов: либо я беру одну и ту же монету более одного раза, либо перехожу к следующей монете: возвращают монеты (a, sum-a [i], i) + монеты (а, сумма-а [I], ++ I); – marwagaser

+0

Хорошо, так по-прежнему та же проблема с приращением и с условиями разрыва. Итак, я даю два совета: 1) о приращении и 2) о состоянии прерывания :) – MateuszW90

0

Я добавил один оператор к коду, в строке 4:

System.out.println(sum + ", " + i); 

Дайте вход 27, выход был:

27, 0 
26, 0 
25, 0 
.... decreasing by one each time... 
3, 0 
2, 0 
1, 0 
0, 0 
-4, 1 
-9, 1 
-14, 1 

И тогда он никогда не останавливается, потому что вы не проверяете sum < 0.

Вы должны быть в состоянии понять это оттуда ... println: самый легкий вес отладчик в мире :-)

+0

У меня есть строка в моем коде; else if (i marwagaser

+0

Это не условие завершения, однако - это просто приводит к другой призыв к «монетам». Если рекурсивная функция убегает и переполняет стек, вам нужно сначала проверить свои условия завершения, а затем исправить любые другие проблемы, которые вы найдете на этом пути. –

+0

Для завершения я имею два условия, когда сумма достигает нуля и i marwagaser