Я собираюсь говорить здесь вообще, потому что ваш текущий код странен до такой степени, что почти наверняка нарушен. Я не совсем понимаю, каким должен быть ваш «результат».
FSM - это определение набора состояний и того, как ввод вызывает переходы состояний. Похоже, вы начали примерно так, но currentOut
не работает.
Если ваша цель состояла в том, чтобы получить сумму, вы победили весь смысл упражнения. Неважно, что это за сумма. Важно то, в каком состоянии вы находитесь в конце, в частности, в состоянии ли вы «принять», в данном случае это состояние, в котором строка равна ровно 40 центам.
Что касается того, как реализовать FSM без каджиллионов if
с, вы часто можете хранить состояния в массиве, и вместо этого ваше имя состояния должно быть номером состояния. На этом этапе вы можете теоретически избавиться от всех ваших if
с. (Тем не менее, в реальном мире вы, возможно, захотите игнорировать или отклонять символы, отличные от (q | d | n).)
Рассмотрим что-то вроде этого (псевдокод):
// Each array in `graph` represents a state.
// Each entry is the state number (ie: index into `graph`) to go to
// when you're in that state and see the corresponding char.
//
// BTW, the state graph makes a lot more sense when you consider nickels first.
// A nickel takes you to the "next" state, and dimes and quarters act like
// 2 and 5 nickels, respectively. When you do that, a pattern shows up.
graph = [
// n d q
//-----------
[ 1, 2, 5 ], // s0
[ 2, 3, 6 ], // s1
[ 3, 4, 7 ], // s2
[ 4, 5, 8 ], // s3
[ 5, 6, 9 ], // s4
[ 6, 7, 9 ], // s5
[ 7, 8, 9 ], // s6
[ 8, 9, 9 ], // s7
[ 9, 9, 9 ], // s8
[ 9, 9, 9 ] // s9 (fail state)
]
start = 0
accept = 8
fail = 9
// at this point, walking the graph is trivial.
state = start
for each char c in s:
index = "ndq".indexOf(c) // n->0, d->1, q->2, others -> -1
state = graph[state][index]
// Once the loop's done:
// if state == accept, you have exactly 40c.
// if state == fail, you have >40c. A FSM won't tell you how much,
// because FSMs can't count.
// any other state represents a known amount that's less than 40c.