Add ru version (#1865)

* Add Russian docs site baseline

* Add Russian localized codebase

* Polish Russian code wording

* Update ru code translation.

* Update code translation and chapter covers.

* Fix pythontutor extraction.

* Add README and landing page.

* placeholder of profiles

* Use figures of English version

* Remove chapter paperbook
This commit is contained in:
Yudong Jin
2026-03-28 04:24:07 +08:00
committed by GitHub
parent 2ca570cc33
commit 772183705e
1958 changed files with 108186 additions and 0 deletions
@@ -0,0 +1,44 @@
/**
* File: binary_search_recur.swift
* Created Time: 2023-09-02
* Author: nuomi1 (nuomi1@qq.com)
*/
/* Бинарный поиск: задача f(i, j) */
func dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {
// Если интервал пуст, целевой элемент отсутствует, вернуть -1
if i > j {
return -1
}
// Вычислить индекс середины m
let m = (i + j) / 2
if nums[m] < target {
// Рекурсивная подзадача f(m+1, j)
return dfs(nums: nums, target: target, i: m + 1, j: j)
} else if nums[m] > target {
// Рекурсивная подзадача f(i, m-1)
return dfs(nums: nums, target: target, i: i, j: m - 1)
} else {
// Целевой элемент найден, вернуть его индекс
return m
}
}
/* Бинарный поиск */
func binarySearch(nums: [Int], target: Int) -> Int {
// Решить задачу f(0, n-1)
dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)
}
@main
enum BinarySearchRecur {
/* Driver Code */
static func main() {
let target = 6
let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]
// Бинарный поиск (двусторонне замкнутый интервал)
let index = binarySearch(nums: nums, target: target)
print("Индекс целевого элемента 6 = \(index)")
}
}
@@ -0,0 +1,47 @@
/**
* File: build_tree.swift
* Created Time: 2023-09-02
* Author: nuomi1 (nuomi1@qq.com)
*/
import utils
/* Построить двоичное дерево: разделяй и властвуй */
func dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {
// Завершить при пустом диапазоне поддерева
if r - l < 0 {
return nil
}
// Инициализировать корневой узел
let root = TreeNode(x: preorder[i])
// Найти m, чтобы разделить левое и правое поддеревья
let m = inorderMap[preorder[i]]!
// Подзадача: построить левое поддерево
root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)
// Подзадача: построить правое поддерево
root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)
// Вернуть корневой узел
return root
}
/* Построить двоичное дерево */
func buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {
// Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }
return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)
}
@main
enum BuildTree {
/* Driver Code */
static func main() {
let preorder = [3, 9, 2, 1, 7]
let inorder = [9, 3, 1, 2, 7]
print("Предварительный обход = \(preorder)")
print("Симметричный обход = \(inorder)")
let root = buildTree(preorder: preorder, inorder: inorder)
print("Построенное двоичное дерево:")
PrintUtil.printTree(root: root)
}
}
@@ -0,0 +1,58 @@
/**
* File: hanota.swift
* Created Time: 2023-09-02
* Author: nuomi1 (nuomi1@qq.com)
*/
/* Переместить один диск */
func move(src: inout [Int], tar: inout [Int]) {
// Снять диск с вершины src
let pan = src.popLast()!
// Положить диск на вершину tar
tar.append(pan)
}
/* Решить задачу Ханойской башни f(i) */
func dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {
// Если в src остался только один диск, сразу переместить его в tar
if i == 1 {
move(src: &src, tar: &tar)
return
}
// Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)
// Подзадача f(1): переместить оставшийся один диск из src в tar
move(src: &src, tar: &tar)
// Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)
}
/* Решить задачу Ханойской башни */
func solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {
let n = A.count
// Хвост списка соответствует вершине столбца
// Переместить верхние n дисков из src в C с помощью B
dfs(i: n, src: &A, buf: &B, tar: &C)
}
@main
enum Hanota {
/* Driver Code */
static func main() {
// Хвост списка соответствует вершине столбца
var A = [5, 4, 3, 2, 1]
var B: [Int] = []
var C: [Int] = []
print("Исходное состояние:")
print("A = \(A)")
print("B = \(B)")
print("C = \(C)")
solveHanota(A: &A, B: &B, C: &C)
print("После завершения перемещения дисков:")
print("A = \(A)")
print("B = \(B)")
print("C = \(C)")
}
}