Есть некоторое расхождение между вашим объяснением и комментариями в коде, но я все равно сделаю все возможное, чтобы объяснить код.
First resolve () попытается найти первое пустое место (то есть такое, которое равно 0). Если он не может найти ни одного, то плата решается, поэтому он возвращает истину.
Если он действительно находит место, то он попытается поместить туда числа 1-9 и проверить если работает с ранее введенными номерами. Скажем, 7 работает (мы не знаем, работают ли 8 или 9, потому что мы еще не проверили это). Итак, мы устанавливаем пустое пространство на 7 и затем передаем обновленную доску в рекурсивном вызове. По сути, это все равно что сказать: «Если я заставлю это место иметь число 7, сможете ли вы найти решение?»
Если рекурсивный вызов вернет истину, это означает, что есть решение с 7 в этом месте и следовательно, у платы есть решение, поэтому мы возвращаем true. Если рекурсивный вызов решения () возвращает false, то мы знаем, что для доски с 7 в этом месте нет решения, поэтому мы сбрасываем это место на 0, а затем пробуем 8 (а затем 9, если необходимо).
Следует помнить, что во всех рекурсивных вызовах есть только одна доска (bo
) - другими словами, все вызовы функций работают с одной и той же переменной bo
. Он не создает копию доски каждый раз, когда вы делаете рекурсивный вызов. Ищите «Передавать по ссылке» и «мелкие или глубокие копии», если хотите узнать больше о том, почему.