2013-08-27 11 views
1

Я был вовлечен в вызов.Рекурсивная функция не соответствует всем путям

Вот вопрос Дано:

Этот вопрос включает в себя игру с мишками. Игра начинается, когда я получаю несколько медведей. Затем вы можете вернуть некоторых медведей, но вы должны следовать этим правилам (где n - количество медведей, которые у вас есть):

Если n равно, то вы можете вернуть ровно n/2 медведей. Если n равно , делящимся на 3 или 4, вы можете умножить последние две цифры n и вернуть это много медведей. (Кстати, последняя цифра n равна n% 10, а следующая-последняя цифра равна ((n% 100)/10). Если n делится на 5, то вы можете вернуть точно 42 . медведи цель игры состоит в том, чтобы итоге РОВНО 42 медведей

Например, предположим, что вы начинаете с 250 медведей Тогда вы могли бы сделать эти шаги:..

--start 250 медведей .

--Since 250 делится на 5, вы можете вернуть 42 медведей, оставив вас с 208 медведей.

- Так как 208 даже, вы можете вернуть половину медведей, оставив вас с 104 медведями.

- Поскольку ровно, вы можете вернуть половину медведей, оставив вас с 52 медведями.

- Поскольку 52 делится на 4, вы можете умножить последние две цифры (в результате получится 10) и вернуть эти 10 медведей. Это дает вам 42 медведей.

- Вы достигли цели!

Написать рекурсивную функцию для удовлетворения этой спецификации:

bool bears(int n) // Postcondition: A true return value means that it is possible to win // the bear game by starting with n bears. A false return value means that // it is not possible to win the bear game by starting with n bears. // Examples: // bear(250) is true (as shown above) // bear(42) is true // bear(84) is true // bear(53) is false // bear(41) is false

Подсказка: Для того, чтобы проверить, является ли п четно, используя выражение ((п% 2) == 0) ,

Вот мое решение но unfortinately всегда возвращает ложь. Я предполагаю, что это не соответствует целым альтернативным путям, но понятия не имеет. Кстати, я очень новичок в VB. Заранее спасибо.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MsgBox(bear(Int(TextBox1.Text))) 
    End Sub 
    Public Function bear(bc As Integer) As Boolean 
     Dim way1, way2, way3 As Integer 
     If bc = 42 Then 
      Return True 
     ElseIf bc < 42 Then 
      Return False 
     ElseIf (bc Mod 2 = 0) Or (bc Mod 3 = 0) Or (bc Mod 4 = 0) Or (bc Mod 5 = 0) Then 

      If (bc Mod 2 = 0) Then 
       way1 = bear(bc/2) 
      End If 
      If (bc Mod 3 = 0) Or (bc Mod 4 = 0) Then 
       way2 = bear((bc Mod 10) * ((bc Mod 100)/10)) 
      End If 
      If (bc Mod 5 = 0) Then 
       way3 = bear(bc - 42) 
      End If 
      If (way1 Or way2 Or way3) Then 
       Return True 
      Else 
       Return False 
      End If 
     Else 
      Return False 
     End If 
    End Function 
+0

'bc' является единственным« встречным счетчиком »' i, и я не сохраняю на нем никакой ценности, кроме как отправить его в 'bear()'. Потому что я только забочусь **, если он может достичь 42 или нет **. Поэтому мне не нужно возвращать числа и отправлять их обратно в 'bear()'. Как я могу это исправить? – Mustafa

ответ

1

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

.. подожди, это выглядит, как вы можете сделать это, просто изменив один линия.В случае MOD 3 или 4, измените эту строку:

way2 = bear((bc Mod 10) * ((bc Mod 100)/10)) 

к ним:

dim gb as Integer 
gb = (bc Mod 10) * ((bc Mod 100)/10) 
If gb <= 0 then Return False 
way2 = bear(bc - gb) 
+0

примечание: обновления добавлены .. – RBarryYoung

+0

Спасибо за ответ, я заметил и исправил 42, но единственная часть, о которой я запутался, это 'If gb = 0 Then Return False'. Как я могу отправить первое значение в 'bear()' при нажатии кнопки? (И я разместил эти 2 строки поверх функции медведя, хорошо?) – Mustafa

+0

@Mustafa Да, хорошая точка. Рассмотрим второе исправление. – RBarryYoung

1

Наиболее очевидным является то, что вы проверяете bears(bearsToTake) вместо bears(bearsLeft-bearsToTake). Я думаю, что вы, возможно, тоже вернетесь досрочно, но я не проверил, так что не цитируйте меня на этом.

Решение в Python для потомков. Вам не обязательно нужно дополнительное «счетное» значение, как говорят другие ответы, но часто бывает полезно использовать его. (Я знаю, что вы не используете Python, но это почти похоже на psuedocode, и, таким образом, мне было легче получить grok.)

Это решение почти идентично вашему - оно просто фиксирует параметр из взятые медведи всем медведям! медведи медведи.

>>> def checkBears(n): 
...  if n == 42: 
...   return True 
...  elif n < 42: 
...   return False 
...  else: 
...   if not n % 2 and checkBears(n/2): 
...    return True 
...   if (not n % 3 or not n % 4) and checkBears(n - n % 10 * (n%100)/10): 
...    return True 
...   if not n % 5 and checkBears(n - 42): 
...    return True 
...  return False 
... 
>>> checkBears(250) 
True 
>>> checkBears(53) 
False 
>>> checkBears(42) 
True 
>>> checkBears(84) 
True