2014-10-03 3 views
0

Я написал следующий код для генерации суммы чисел, например, если я вхожу в 10, он будет генерировать сумму, равную 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0: 55, который отлично работает.Функция рекурсии возвращает неправильное значение

public int GenerateSum(int num) 
    { 
     if (num <=0) 
     { 
      return 0; 
     } 
     int temp = num + GenerateSum(num - 1); 
     return temp; 
    } 

Теперь я изменил этот код, чтобы генерировать разница, например, если я ввожу число сказать, 10 он будет генерировать это разница как 10-9-8-7-6-5-4-3-2-1 -0 выход: -35

public int GenerateDifference(int num) 
    { 
     if (num <= 0) 
     { 
      return 0; 
     } 
     int temp = num - GenerateDifference(num - 1); 
     return temp; 
    } 

Теперь, когда я бегу GenerateDifference (10) он возвращает мне выход 5. Для GenerateDifference (100) он дает мне выход 50, который тоже неправильно. Если он работает на сумму, он должен работать и на разницу (если я ошибаюсь, пожалуйста, поправьте меня). Любая помощь или руководство по этому вопросу.?

+1

Проверьте требуемый приоритет/порядок операций. Вы вычисляете 10- (9- (8- (7- (6- (5- (4- (3- (2- (1-0))))))))). –

+0

10- (9- (8- (7- (6- (5- (4- (3- (2-) 6-5-4-3-2-1-0 –

+1

Ну, «разница между всеми числами от 0 до n» просто не имеет смысла, как «сумма всех чисел от 0 до n». –

ответ

3

Приведенный выше код дает 5, так как при использовании рекурсии для создания 10-9-8-7-6-5-4-3-2-1-0, что такое рекурсия заканчивается делаете

10 - (9 - (8 - (7 - (6 - (5 - (4 - (3 - (2 - (1 - 0))))))))) 

решить вышеприведенное уравнение, вы получите 5 как ответ

, поскольку вам нужен решение 10-9-8-7-6-5-4-3-2-1-0 вы можете упростить это до 10 - (9+8+7+6+5+4+3+2+1+0). Затем, чтобы получить ответ с помощью рекурсии вам нужно что-то вроде этого

public int GenerateDifference(int num) 
{ 
    if (num <= 0) 
    { 
     return 0; 
    } 
    int temp = num - GenerateSum(num - 1); 
    return temp; 
} 
+0

Я не знал, что мне нужно ее оценить с помощью круглых скобок. Большое спасибо. можете ли вы предложить мне лучшую статью, из которой я могу удалить свои другие двусмысленности, связанные с рекурсией. –

+0

@JamalHussain: Я дал круглые скобки, чтобы дать понять, что выполняется первым и какова последовательность выполнения. вы можете думать о рекурсии как об использовании стека, который толкает текущую функцию, а затем вызывает следующую. В конце концов, выполнение выполняется из верхней части стека, выбирая каждую функцию по мере ее завершения. прочитайте эту ссылку. это может помочь вам. (http://en.wikibooks.org/wiki/A-level_Computing/AQA/Problem_Solving,_Programming,_Operating_Systems,_Databases_and_Networking/Programming_Concepts/Recursive_Techniques) – Haris

1

Вы получите значение 10-9-8-7-6-5-4-3-2-1-0 с 10 - GenerateSum(9).

0

Что относительно этого?

public int GenerateDifference(int num) 
{ 
    if (num <= 0) 
    { 
     return 0; 
    } 
    int temp = num - GenerateSum(num - 1); 
    return temp; 
} 

public int GenerateSum(int num) 
{ 
    if (num <=0) 
    { 
     return 0; 
    } 
    int temp = num + GenerateSum(num - 1); 
    return temp; 
} 
1

Это проблема знака:

10 - (9 - (8 - (7- (6- (5- (4- (3- (2- (1- (0))))))))))) = 10 - 9 +8 - 7 + 6 -5 +4 -3 +2 -1 = 5

0

Пример на PHP.

function sum($n) { 
    if ($n <= 0) return 0; else return $n + sum($n-1); 
} 

function diff($n) { 
    return $n - sum($n - 1); 
} 
Смежные вопросы