华为开发者空间:递归排序教学,搭建学生成绩管理系统

一、概述

1. 案例介绍

在C语言中,递归是函数调用自身的技术,通过基例终止递归,递归步骤分解问题(阶乘计算、斐波那契数列、汉诺塔问题)。排序算法则对数据进行有序排列,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、计数排序等。最终结合递归和排序,实现一个简单的学生成绩管理系统开发。
本案例相关实验将在华为云开发者空间云主机进行,开发者空间云主机为开发者提供了高效稳定的云资源,确保用户的数据安全。云主机当前已适配完整的C/C++开发环境,支持VS Code等多种IDE工具安装调测。

2. 适用对象

  • 个人开发者
  • 高校学生

3. 案例时间

本案例总时长预计50分钟。

4. 案例流程

说明:

  1. 开通开发者空间,搭建C/C++开发环境;
  2. 打开VS Code,编写代码运行程序。

资源总览

本案例预计花费0元。

资源名称规格单价(元)时长(分钟)
华为开发者空间 - 云主机鲲鹏通用计算增强型 kc2.xlarge.2 | 4vCPUs8G | Ubuntu免费50
VS Code1.97.2免费50

最新案例动态,请查阅 《【递归与排序】递归 or 排序:“俄罗斯套娃"与"数据的交响乐指挥”》。小伙伴快来领取华为开发者空间进行实操吧!

二、配置实验环境

1. 开发者空间配置

面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。

领取云主机后可以直接进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。

2. 配置实验环境

参考案例中心《基于开发者空间,定制C&C++开发环境云主机镜像》“2. 实验环境搭建”、“3. VS Code安装部署”章节完成开发环境、VS Code及插件安装。

三、递归

1. 递归的定义

递归是一种编程技术,函数通过直接或间接地调用自身来解决问题。它将一个复杂的大问题分解成一个或多个与原问题结构相同但规模更小的子问题来解决,直到子问题足够小,可以直接求解(称为基线条件或递归终止条件)。

为什么用递归?

  • **简洁性:**对于某些问题(如树、图遍历,分治算法),递归代码比等价的循环代码更简洁、更易理解和编写,更贴近问题的自然数学定义。
  • **分治策略:**天然适合“分而治之”的算法设计模式(如归并排序、快速排序)。
  • **问题分解:**将复杂问题分解为更小的、相同结构的子问题。

2. 经典入门例子-阶乘计算

数学定义:

  • n! = n * (n-1)!
  • 0! = 1 (基线条件)

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>

// 递归计算阶乘
long factorial(int n) {
    // 1. 递归终止条件
    if (n == 0) {
        return 1;
    } else {
        // 2. 递归调用:分解为 n * (n-1)! 的子问题
        // 3. 向基线条件(n=0)推进
        return n * factorial(n - 1); 
    }
}

int main() {
    int num = 5;
    long result = factorial(num);
    // 输出: Factorial of 5 is 120
    printf("Factorial of %d is %ld\n", num, result); 
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

执行过程分析 (factorial(3)):

  • factorial(3) 调用 factorial(2);
  • factorial(2) 调用 factorial(1);
  • factorial(1) 调用 factorial(0);
  • factorial(0) 到达基线条件,返回 1;
  • factorial(1) 计算 1 * factorial(0) = 1 * 1 = 1,返回 1;
  • factorial(2) 计算 2 * factorial(1) = 2 * 1 = 2,返回 2;
  • factorial(3) 计算 3 * factorial(2) = 3 * 2 = 6,返回 6。

3. 斐波那契数列

什么是斐波那契数列?

斐波那契数列‌是一个经典的数学数列,其特点是每一项均为前两项之和,通常以0、1或1、1为起始。该数列由意大利数学家莱昂纳多·斐波那契在1202年提出,因兔子繁殖问题而闻名,故又称“兔子数列”或“黄金分割数列”。

数学定义:

  • fib(0) = 0
  • fib(1) = 1
  • fib(n) = fib(n-1) + fib(n-2) (当 n > 1)

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>

// 递归计算斐波那契数
int fibonacci(int n) {
    // 1. 递归终止条件
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        // 2. 递归调用:分解为 fib(n-1) + fib(n-2) 两个子问题
        // 3. 向基线条件(n=0或1)推进
        return fibonacci(n - 1) + fibonacci(n - 2); 
    }
}

int main() {
    int num = 6;
    int result = fibonacci(num);
    // 输出: Fibonacci number at position 6 is 8
    printf("Fibonacci number at position %d is %d\n", num, result); 
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

4. 汉诺塔问题及其递归算法

问题阐述:
汉诺塔问题:有3根标号为A、B、C的柱子,在A柱子上放着n个从大到小叠放的圆盘。目标是把所有圆盘移动到C柱,规则如下:

  • 一次只能移动一格盘子;
  • 移动过程中大盘不能放在小盘子上面;
  • 在移动过程中盘子可以放在A、B、C的任意一个柱子上。

递归策略:

**基线条件 (n=1):**直接将唯一的一个圆盘从源柱 (src) 移动到目标柱 (dest)。

递归步骤 (n>1):

  • 将上面的 n-1 个圆盘,借助目标柱 (dest) 作为辅助柱 (aux),递归地从源柱 (src) 移动到辅助柱 (aux)。
  • 将最大的第 n 个圆盘直接从源柱 (src) 移动到目标柱 (dest)。
  • 将之前移到辅助柱 (aux) 上的 n-1 个圆盘,借助源柱 (src) 作为辅助柱,递归地从辅助柱 (aux) 移动到目标柱 (dest)。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>

// 递归解决汉诺塔问题
void hanoi(int n, char src, char aux, char dest) {
    // 1. 递归终止条件:只有一个盘子
    if (n == 1) {
        printf("Move disk 1 from %c to %c\n", src, dest);
        return;
    }

    // 2. 递归调用1:将 n-1 个盘子从 src 借助 dest 移动到 aux
    hanoi(n - 1, src, dest, aux);

    // 3. 移动最大的盘子:从 src 直接到 dest
    printf("Move disk %d from %c to %c\n", n, src, dest);

    // 4. 递归调用2:将 n-1 个盘子从 aux 借助 src 移动到 dest
    hanoi(n - 1, aux, src, dest);
}

int main() {
    int num_disks = 3;
    hanoi(num_disks, 'A', 'B', 'C'); // 从 A 借助 B 移动到 C
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

三、排序

1. 排序算法分类

  • 比较排序:通过比较元素决定顺序(冒泡、选择、插入、快速、归并、堆排序)。
  • 非比较排序:不直接比较元素(计数、桶、基数排序)。
  • 稳定排序:相等元素保持原顺序(插入、归并、冒泡、计数)。
  • 不稳定排序:可能改变相等元素顺序(选择、快速、堆排序)。

2. 排序算法复杂度

算法最好时间复杂度平均时间复杂度最坏时间复杂度空间复杂度
冒泡排序O(n)O(n²)O(n²)O(1)
选择排序O(n²)O(n²)O(n²)O(1)
插入排序O(n)O(n²)O(n²)O(1)
快速排序O(n log n)O(n log n)O(n²)O(log n)
归并排序O(n log n)O(n log n)O(n log n)O(n)
堆排序O(n log n)O(n log n)O(n log n)O(1)
计数排序O(n + k)O(n + k)O(n + k)O(k)

3. 冒泡排序

冒泡排序是最基础的排序算法之一,它的核心思想是通过重复比较相邻元素并交换位置,使较大的元素逐渐"冒泡"到数组的末尾。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>

// 冒泡排序函数实现
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {  // 外层循环控制排序轮数
        int swapped = 0;  // 标记本轮是否发生交换
        
        // 内层循环进行相邻元素比较
        for (int j = 0; j < n - i - 1; j++) {
            // 如果前一个元素大于后一个元素,则交换它们
            if (arr[j] > arr[j + 1]) {
                // 交换元素
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;  // 标记发生了交换
            }
        }
        
        // 如果本轮没有发生交换,说明数组已有序,提前结束排序
        if (!swapped) {
            break;
        }
    }
}

// 打印数组函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    // 示例1: 整数数组排序
    int numbers[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(numbers) / sizeof(numbers[0]);
    printf("排序前的数组: \n");
    printArray(numbers, n);
    // 调用冒泡排序函数
    bubbleSort(numbers, n);
    printf("排序后的数组: \n");
    printArray(numbers, n);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

4. 选择排序

选择排序是一种简单直观的排序算法,它的核心思想是重复地在未排序部分中找到最小(或最大)元素,并将其放到已排序部分的末尾。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

// 选择排序函数实现
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        // 假设当前索引i是最小元素的索引
        int min_index = i;
        
        // 在未排序部分中查找最小元素
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_index]) {
                min_index = j;
            }
        }
        
        // 将找到的最小元素与当前位置元素交换
        if (min_index != i) {
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

// 打印数组函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 验证数组是否已排序
int isSorted(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            return 0; // 未排序
        }
    }
    return 1; // 已排序
}

int main() {
    // 示例1: 整数数组排序
    int numbers[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(numbers) / sizeof(numbers[0]);
    printf("排序前的数组: \n");
    printArray(numbers, n);
    // 调用选择排序函数
    selectionSort(numbers, n);
    printf("排序后的数组: \n");
    printArray(numbers, n);
    // 验证排序结果
    printf("排序验证: %s\n\n", isSorted(numbers, n) ? "成功" : "失败");
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

5. 插入排序

插入排序是一种简单直观的排序算法,它的核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <string.h>

// 插入排序函数实现
void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];  // 当前需要插入的元素
        int j = i - 1;
        
        // 将大于key的元素后移
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        
        // 插入key到正确位置
        arr[j + 1] = key;
    }
}

// 打印数组函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 验证数组是否已排序
int isSorted(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            return 0; // 未排序
        }
    }
    return 1; // 已排序
}

int main() {
    // 示例1: 整数数组排序
    int numbers[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("排序前的数组: \n");
    printArray(numbers, n);
    
    // 调用插入排序函数
    insertionSort(numbers, n);
    
    printf("排序后的数组: \n");
    printArray(numbers, n);
    
    // 验证排序结果
    printf("排序验证: %s\n\n", isSorted(numbers, n) ? "成功" : "失败");
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

6. 快速排序

快速排序是一种高效的分治排序算法,它的核心思想是选取一个基准元素,将数组分成两部分,一部分小于基准,一部分大于基准,然后递归地对两部分进行排序。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <stdlib.h>
 
// 交换两个元素的值 
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
// 分区函数(核心逻辑)
int partition(int arr[], int low, int high) {
    // 选择最后一个元素作为基准
    int pivot = arr[high];  
    // 较小元素的索引 
    int i = (low - 1);      
    for (int j = low; j <= high - 1; j++) {
        // 当前元素小于基准时 
        if (arr[j] < pivot) {  
            // 递增较小元素索引 
            i++;               
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
// 快速排序主函数 
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // 获取分区位置 
        int pi = partition(arr, low, high);  
        // 递归左半区
        quickSort(arr, low, pi - 1); 
        // 递归右半区         
        quickSort(arr, pi + 1, high);        
    }
}
// 打印数组函数 
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
int main() {
    // 测试数据:包含正负数和非连续数字 
    int arr[] = {9, -3, 5, 2, 6, 8, -6, 1, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("排序前数组: \n");
    printArray(arr, n);
    quickSort(arr, 0, n - 1);
    printf("\n排序后数组: \n");
    printArray(arr, n);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

7. 归并排序

归并排序是一种高效、稳定的排序算法,基于分治策略实现。它的核心思想是将数组分成两半,分别对每部分进行排序,然后将排序好的两部分合并成一个有序数组。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <stdlib.h>
 
// 合并两个有序数组
void merge(int arr[], int l, int m, int r) {
    int n1 = m - l + 1;
    int n2 = r - m;
    
    // 创建临时数组
    int L[n1], R[n2];
    
    // 拷贝数据到临时数组
    for (int i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (int j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];
    
    // 合并临时数组
    int i = 0, j = 0, k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    
    // 拷贝剩余元素
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}
// 归并排序主函数
void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}
// 打印数组函数 
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
int main() {
    int arr[] = {10, 35, 2, 6, 8, 1, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("排序前数组: \n");
    printArray(arr, n);
    mergeSort(arr, 0, n - 1);
    printf("\n排序后数组: \n");
    printArray(arr, n);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

8. 堆排序

堆排序‌是一种基于二叉树数据结构的排序算法。其核心思想是通过构建一个最大堆或最小堆,利用堆的性质逐步将堆顶元素(最大值或最小值)取出,从而实现排序。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <stdlib.h>
 
// 调整堆
void heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2*i + 1;
    int right = 2*i + 2;
    
    if (left < n && arr[left] > arr[largest])
        largest = left;
    
    if (right < n && arr[right] > arr[largest])
        largest = right;
    
    if (largest != i) {
        int swap = arr[i];
        arr[i] = arr[largest];
        arr[largest] = swap;
        heapify(arr, n, largest);
    }
}

// 堆排序主函数
void heapSort(int arr[], int n) {
    // 构建最大堆
    for (int i = n/2 - 1; i >= 0; i--)
        heapify(arr, n, i);
    
    // 提取元素
    for (int i = n-1; i > 0; i--) {
        // 移动当前根到末尾
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        
        // 调整剩余堆
        heapify(arr, i, 0);
    }
}
// 打印数组函数 
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
int main() {
    int arr[] = {10, 8, 21, 14, 1, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("排序前数组: \n");
    printArray(arr, n);
    heapSort(arr, n);
    printf("\n排序后数组: \n");
    printArray(arr, n);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

9. 计数排序

计数排序是一种非比较型的整数排序算法。它的核心思想不是通过元素之间的直接比较来确定顺序,而是利用输入数据的范围信息,通过统计每个整数出现的次数,然后直接推导出每个元素在有序序列中的位置。

具体代码实现:
Step1:复制以下代码,替换main.cpp文件中的代码。

#include <stdio.h>
#include <stdlib.h>
 
void countingSort(int arr[], int n) {
    // 找出最大最小值
    int max = arr[0], min = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] > max) max = arr[i];
        if (arr[i] < min) min = arr[i];
    }
    
    int range = max - min + 1;
    int count[range];
    int output[n];
    
    // 初始化计数数组
    for (int i = 0; i < range; i++)
        count[i] = 0;
    
    // 计数每个元素出现次数
    for (int i = 0; i < n; i++)
        count[arr[i] - min]++;
    
    // 计算累计计数
    for (int i = 1; i < range; i++)
        count[i] += count[i-1];
    
    // 构建输出数组
    for (int i = n-1; i >= 0; i--) {
        output[count[arr[i] - min] - 1] = arr[i];
        count[arr[i] - min]--;
    }
    
    // 拷贝结果回原数组
    for (int i = 0; i < n; i++)
        arr[i] = output[i];
}
// 打印数组函数 
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
int main() {
    int arr[] = {-8, 4, 21, 14, 1, 0};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("排序前数组: \n");
    printArray(arr, n);
    countingSort(arr, n);
    printf("\n排序后数组: \n");
    printArray(arr, n);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

四、递归与排序综合案例:学生成绩管理系统

1. 场景描述

某班级有若干名学生,需要按考试成绩从高到低排名,并支持递归查询任意学生的排名。
核心功能:

  • 使用递归实现快速排序算法对成绩排序;
  • 通过递归二分查找定位学生排名;
  • 输出排序结果与查询信息。

2. 完整代码实现

#include <stdio.h>
#include <stdlib.h>
// 递归快速排序(分治策略)
void quick_sort(int scores[], int left, int right) {
    // 递归终止条件 
    if (left >= right) return; 
    // 取中间值作为基准 
    int pivot = scores[(left + right) / 2]; 
    int i = left, j = right;
    
    // 分区操作 
    while (i <= j) {
        // 降序排序:大的在前 
        while (scores[i] > pivot) i++; 
        while (scores[j] < pivot) j--;
        if (i <= j) {
            int temp = scores[i];
            scores[i] = scores[j];
            scores[j] = temp;
            i++;
            j--;
        }
    }
    
    // 递归处理子分区 
    quick_sort(scores, left, j); 
    quick_sort(scores, i, right);
}
// 递归二分查找排名
int find_rank(int scores[], int left, int right, int target) {
    // 未找到 
    if (left > right) return -1; 
    
    int mid = (left + right) / 2;
    // 返回排名(从1开始)
    if (scores[mid] == target) return mid + 1; 
    
    if (target > scores[mid]) 
    // 向左递归 
        return find_rank(scores, left, mid - 1, target); 
    else 
    // 向右递归 
        return find_rank(scores, mid + 1, right, target); 
}
int main() {
    // 初始化学生数据 
    char* names[] = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十"};
    int scores[] = {78, 95, 63, 84, 91, 59, 72, 88};
    const int n = 8;
    // 递归快速排序 
    quick_sort(scores, 0, n - 1);
    
    // 打印成绩排名 
    printf("成绩排名榜:\n");
    printf("排名\t姓名\t分数\n");
    printf("-------------------\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%s\t%d\n", i + 1, names[i], scores[i]);
    }
    // 递归查询示例 
    int query_score = 84;
    int rank = find_rank(scores, 0, n - 1, query_score);
    printf("\n查询结果:考%d分的学生排名第%d位\n", query_score, rank);
    return 0;
}

Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

至此,【递归与排序】递归 or 排序:"俄罗斯套娃"与"数据的交响乐指挥"案例已全部完成。

相关推荐

鸿蒙案例上新啦 | 购物、听歌、健身:15个模板带你一键激活社交娱乐

页面层级如何组织、跨页共享状态如何同步、列表与详情及个人中心如何形成稳定闭环。鸿蒙开发实践中心将这些高频消费与互动场景沉淀为可参考的标准模板,提供从业务架构到界面实现的快捷实践入口。更多实战案例欢迎前往鸿蒙开发实践中心案例中心查看并开启云端体验。

华为云官方博客 338

鸿蒙案例上新啦 | 出门打车、到家上课:25个模板带你一屏打通日常生活

如何合理拆分页面组件、如何建立单一可信的状态源、如何让用户在每一步操作中都获得明确反馈。鸿蒙开发实践中心以标准化的应用与元服务模板为入口,将清晰的业务架构与可复用的代码结构直观呈现。不妨立即挑选一个感兴趣的方向进入云端环境,从页面布局、组件封装、状态管理到路由组织,亲手跑通你的鸿蒙实战项目。

华为云官方博客 325

LakeAgent:DWS数据仓库的第二大脑,告别 “翻译式运维”,迈入智能自治时代

和普通 SQL 改写工具不同,LakeAgent 自动做多方案代价对比,主动规避负优化陷阱:补充分区键过滤实现剪枝,扫描分区由 37 收敛至 1,执行代价从 758.28 降至 113.74;未来的数据仓库,将不止能算、能存,更能看懂自己、诊断自己、理解自己。长久以来,数仓的智能都依附于人:信号需要人解读,瓶颈需要人研判,经验困在个体里,无法随底座永续生长。CPU 高、CPU 告警、CPU 诊断、CPU 使用率过高、CPU 满。语法、错误码、计费、性能调优、最佳实践、故障处置等全场景内容。

华为云官方博客 555

如何使用RDS Supabase后端BaaS能力:文件存储(File Storage)

• product-images(公开桶,允许公共读取):策略名称"Public read for product-images",允许SELECT,目标角色anon,策略定义bucket_id = 'product-images'。上传/删除需另配INSERT/DELETE策略,详见SQL。• product-specs(私有桶,仅认证用户访问自己的文件夹):建议拆为上传、读取、删除三条策略,策略定义均为 bucket_id = 'product-specs' 且仅限本人文件夹(详见下文 SQL)。

华为云官方博客 476

如何使用RDS Supabase后端BaaS能力:实时订阅与推送(Realtime)

Realtime 把数据库的每次变更同步到客户端:表里增、删、改一行,订阅者无需刷新页面或主动请求即可秒级收到。三大能力各司其职:• Postgres Changes — 监听表的 INSERT/UPDATE/DELETE,变化即通知• Broadcast — 客户端之间直接互发,适合瞬时通知、协同编辑• Presence — 跟踪频道里“谁在线”典型场景有实时数据展示(订单、库存、监控指标即时刷新)、即时通讯(消息收发、在线名单、“对方正在输入”)、协同编辑与实时通知。

华为云官方博客 465

AI Agent如何通过MCP连接到华为云RDS Supabase应用平台

Schema元数据列出所有可访问的表(按schema分组)。Schema元数据列出表的列及元数据(类型/默认值/约束)。Schema元数据列出所有约束(PK/FK/UNIQUE/CHECK/EXCLUDE)。可按schema/表/类型过滤。Schema元数据列出所有外键关系。可按schema/表过滤。Schema元数据列出所有索引及定义和大小。可按schema/表过滤。Schema元数据列出已应用的数据库迁移记录。Schema元数据列出已安装的PostgreSQL扩展。

华为云官方博客 473

华为大数据Flink让每一 CU 算力,跑出开源 5.74 倍的性能

1. 开源Apache Flink 已成为业界流计算事实标准,但在极端重负载场景下存在性能瓶颈。2. 华为大数据Flink通过多项自研深度优化,在执行计划、算子执行、状态存储三个层面构建协同的优化体系。3. Nexmark Benchmark 测试结果:整体性能提升 5.74 倍,极端重负载场景性能领先最高 18.3 倍。4. 100% 兼容 Apache Flink 1.20,业务代码零改造,无缝迁移。

华为云官方博客 380

LakeAgent实战 | 业务分析篇从一句提问到业务分析

本文以“订单金额变化”分析为例,展示LakeAgent如何通过自然语言提问,结合DataArtsStudio的数据资产与专业技能,帮助业务人员快速定位数据、生成SQL、追踪血缘、生成报告。从问题出发,逐步实现数据发现、变化洞察、原因追溯与团队协作,最终形成可复用的分析流程与企业规则,显著提升数据分析效率与一致性。

华为云官方博客 389

华为云RDS Supabase AI应用已开放公测 :30分钟搭建AI应用后端

认证、存储、实时推送、数据库API——4个后端模块,传统开发需要数周。今天,你只需要30分钟。AI创业公司的全栈开发工程师。上周老板说"下周要上线的AI对话应用,后端你来搞"——认证鉴权、数据库接口、文件存储、实时推送,每一个模块都需要数周搭建,而市场不会等你。小张打开华为云RDS Supabase,30分钟搭好认证、数据库API、对象存储,剩下的时间全用来打磨AI交互体验。基于开源Supabase+华为云RDS PostgreSQL全托管能力,为开发者提供。

华为云官方博客 396

如何使用RDS Supabase后端BaaS能力:数据库函数(Database Function)

上一篇介绍了 Database Data API——建表即自动生成增删改查接口,解决单表读写,但聚合统计、跨表事务、字段自动维护等逻辑已超出其能力边界。本篇推进到数据库函数(Database Function):把业务逻辑封装进数据库,前端通过 .rpc() 调用,由触发器自动响应数据变更。上一篇中,小张基于 Data API 完成了产品目录的建表与基础读写。但新需求随之而来:按分类统计产品数与价格区间、上架新品同时写产品表与定价表、产品修改后自动刷新更新时间。

华为云官方博客 464

如何使用RDS Supabase后端BaaS能力:创表即生成API(Database Data API)

认证、存储、实时推送、数据库API——4个后端模块,传统开发要数周。本系列逐个拆解,首篇聚焦数据库API(Database Data API):建表即得 API,无需手写后端。小张,AI创业公司的全栈工程师。老板让他做个产品目录页,展示产品与价格、支持上下架。传统做法要搭后端、写接口、配权限,工期少说1-2周;而在华为云RDS Supabase,建两张表、应用 SDK 直连,几分钟增删改查全跑通。

华为云官方博客 478

从一句话到一个能出去的链接,AI开发者空间做了什么

自行搭建的 Agent、正在使用的开源项目、团队既有的工具,都可以接入,可以通过AI创建或者手动搭建环境;华为云 AI开发者空间——面向开发者的云端一站式开发平台,做的就是把这段路接上:环境免安装,浏览器打开即为完整的 Linux 运行环境,预置的 AI 智能体开箱即用。第一个任务建议选能出结果的:做一个游戏、生成一个页面、创建一台实例,从需求走到可访问的链接,一次就能看清这个环境在做什么。沙箱是一个完整的 Linux 环境,依赖、服务、端口都是真实的,不是模拟。环境释放后,权限随之失效。

华为云官方博客 426

华为云码道配置自定义大模型,四种方式完整实操

案例介绍。

华为云官方博客 624

图数据库:实现穿透式监管的数据基座

穿透式监管标志着国企监管从“管企业”向“管资本”转型过程中的关键一跃。而图数据库正是这一跃的技术支点。从股权穿透到资金链穿透,从供应链穿透到数据穿透,华为GES图数据库正在将“穿透式监管”从理念变为可落地、可操作的实践。无论是天眼查式的全量链路查询,还是某集团财经的税务规则判断,抑或是芯片供应链式的部件风险分析,乃至通过Palantir构建决策知识图谱,其底层逻辑都是一致的——用图的力量,穿透一切形式的“隔离层”,直抵风险本质与责任核心。

华为云官方博客 664

《公共云三十问》正式收官,奔赴企业AI百场景新征程

今年6月底,公共云产业联盟重点推出《公共云三十问》专栏,以每周三问的节奏,连载十周,解读《先进公共云》白皮书,分享国计民生系列案例,旨在凝聚共识、推动落地实践。同时,专栏分析公共云在产业升级、民生福祉、科技创新、全球发展等方面的作用,梳理中国特色公共云发展路径:以普惠云拓展用云广度,以智算云提升用云深度,以自主云夯实用云厚度,以全球云打开用云跨度。这十问从专属云、行业云切入,深入政务、金融、交通、电力、钢铁、化工、油气、制造等国计民生场景,回答公共云“怎么用”。

华为云官方博客 473

开发者小技巧|IAM配置,让码道代码智能体连续30天免登录

案例介绍。

华为云官方博客 645

码道深度对接CodeArts,让需求自动落地为代码

案例介绍。

华为云官方博客 720

【公共云三十问 之三十】拥抱AI,企业如何建设面向智能体的专属云?

企业可分阶段建设覆盖开发、运行、运营及安全的一体化智能体平台——从构建一站式、高低码协同的智能体开发平台,到打造高性能、极致弹性的运行时环境,再到搭建AgentOps驱动的持续运营与运维体系,同时构建端到端、多层次的全链路安全防护体系。在数据湖建设方面,遵循“存量复用、平滑演进、AI导向、分步迭代”原则,分三阶段推进——打造AI多模数据湖核心能力、完成存算分离与统一元数据管理、实现闭环赋能全面支撑智能体规模化落地,在保护既有投资的前提下将传统数据平台转型为AI数据专属供给平台。

华为云官方博客 823

【公共云三十问 之二十九】国计民生之制造:制造云如何重塑数智时代的新质生产力?

平台打通软件交付的完整路径,覆盖需求管理、代码托管、代码检查、编译构建、制品仓库、部署、测试等关键环节,支持大模型能力融入研发全流程,实现从需求到交付的端到端管理。通过构建“研发一朵云”,方案打破地域与组织壁垒,实现跨团队协同开发,有效缩短软件交付周期,助力工业制造企业从“传统研发”走向“敏捷研发”,加速数智化转型进程。当制造云真正成为数据流通的平台、AI创新的底座,公共云的社会价值将从基础设施层向生产场景层持续延伸,为新型工业化建设和制造强国战略注入源源不断的动力,重塑数智时代的中国制造新质生产力。

华为云官方博客 789

告别重复手工迁仓,码道MCP+Skill实现仓库批量迁移

案例介绍。

华为云官方博客 790

【公共云三十问 之二十八】国计民生之油气:智算云如何叩响数智时代的“地心蓝金”?

西南油气田以“向地球深部要资源”为战略方向,联合以华为云Stack为代表的公共云服务商共同打造统一算力底座,建设西南区域数据湖与通用技术平台,构建“勘探开发工程技术、天然气生产过程管控、天然气产运储销”等三个一体化协同应用场景,支撑油气勘探、开发生产、管输储运等全业务链的数智化转型。当智算云真正成为数据流通的平台、AI创新的底座,油气田得以将算力效能、数据价值与智能技术深度融入勘探开发全链条,将“看不见的算力”转化为“摸得着的储量”,以智能化手段持续降低勘探风险、缩短发现周期、提高采收效率,确保生产安全。

华为云官方博客 613

【公共云三十问 之二十七】国计民生之化工:数智云如何重塑传统化工新范式?

在架构方面,方案构建云边协同的统一体系,涵盖AI协同、数据协同与运营协同三大维度——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现“边用边学”的智能闭环,模型平均精度提升20%以上。此外,方案提供一站式企业级工业物联网平台、数据湖与数据治理平台,覆盖工业数据分析“采、存、算、管、用”全流程,打通生产现场与管理系统间的数据壁垒,有效消除数据孤岛。层面,方案充分发挥软硬协同优势,实现计算、存储、网络与云平台的深度协同,训练线性度超95%,为大模型训练推理提供强劲算力支撑。▲化工“数智”新模式。

华为云官方博客 663

【公共云三十问 之二十六】国计民生之钢铁:数智云如何淬炼中国钢铁新力量?

同时,构建云边端协同的统一架构,支撑集团总部与各生产基地两级协同发展——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现训推一体化的资源调度与高效协同,为钢铁行业的数智化转型构建了坚实的算力底座。层面,方案构建覆盖“工业数采→边缘IT/OT融合→统一数据湖→数据治理平台→数据应用”全链路的一站式数据治理与流通平台,打通生产现场与管理系统间的数据壁垒,让数据“采得到、流得动、用得好”,加速数据价值从生产现场向经营决策层流动释放。湘潭钢铁集团的钢铁数智云,是钢铁工业智能云建设的标杆案例。

华为云官方博客 526

LakeWatch——MRS 智能运维Agent

从资源池、队列、作业等多个维度,对集群CPU与内存资源进行精细化分析与对比,直观呈现不同时间段的空闲、满载等使用状态,识别资源浪费,指导治理优化,为扩缩容决策提供数据支撑。对HDFS存储进行多维度深度分析(目录、用户、用户组等),涵盖使用量、增量、文件大小分布及数据热度等指标,帮助快速识别增长较快的目录、长期未访问的文件,统计目录文件数量与小文件占比,评估HDFS总存储量与扩缩容需求,为存储治理与资源规划提供全面数据支撑。Agent主动巡检,识别异常趋势并提前预警,让运维从"事后处理"转向"事前预防"。

华为云官方博客 515

华为云专题文档发布:丰富的AI案例、选型指导和概念解读

发布 “云服务选型”、“云计算概念”专题,提供云服务选型指导,助您选择匹配业务的云服务,解读云计算相关概念,开启云上学习之路。开发者工具和文档专区上线,提供从学习、实践到反馈的全链路支持。帮助中心新增100余篇AI案例。

华为云官方博客 286

一个人,也能用AI做点“星东西”

华为云星耀创想者大赛-2026华为云OPC创意大赛等你来~

华为云官方博客 290

从需求到可执行工作项:MCP+Skill 让智能体规划真正落地

回顾整个体验,以前让智能体帮我拆需求,它是洋洋洒洒给我列了一大篇 Markdown,看着挺像那么回事,但最后还是得我一条条往 CodeArts Req 里搬,搬完再手动挂父子关系、排日期,拆需求五分钟,搬运两小时。现在好了,MCP 给智能体接上了"手",Skill 给它装上了"项目经理的脑子",一句话下去,34 个工作项连带排期、层级关系全给我建好了,甘特图一拉,齐刷刷都在两周内,节省了多少工作量啊,美滋滋。本次实操在码道代码智能体基础上,构建了一套"需求→可执行工作项"的自动化规划方案。

华为云官方博客 576

华为云码道「码力续航计划」更新!

✅上新GLM‑5.3‑Flash,高速响应,代码生成、工程解析、Agent调试高效输出。新增GLM‑5.3‑Flash福利模型,每日解锁1000万免费Tokens。● 本次活动共发放总量价值100万元Tokens,发完即止!把耗算力的编码重活,交给华为云码道代码智能体🚀🚀。● 每日额度准时刷新,当日清零、次日满血重置。✅复杂算法、大项目解析、批量代码生成随便跑。✅不用抠额度、不用算消耗,放开调试大胆迭代。✅无需额外操作,登录即送,直接切换模型使用。● 把算力交给码道,让撸码不再内耗👏🏻。

华为云官方博客 686

【公共云三十问 之二十四】国计民生之交通:交通云如何铺就数智通衢新坦途?

交通行业作为支撑实体经济的关键基础设施,涵盖公路、铁路、机场、港口、地铁等众多子领域,其中,公路网络作为综合交通运输体系的基础骨架,承担着全国超过70%的客货运量,其数字化、智能化转型的需求尤为迫切。方面,提供Agent开发框架、知识库管理、RAG工程、意图识别、静态应用编排及模型评测等能力,支持客户将行业知识、业务流程与AI能力深度融合,快速构建面向收费稽核、路网调度、应急处置等场景的智能应用。开发并实现落地应用,全面覆盖建设、管理、养护、运营、服务、安全、办公七大业务领域。

华为云官方博客 461

【公共云三十问 之二十五】国计民生之电力:电力云如何点亮数智电力新引擎?

方案构建了覆盖数据获取、质量评估到标准化处理的全链路能力。基于公共云服务商智算底座及气象大模型,通过时空图神经网络重新建模产流机制,中国华电建成超50TB多源融合数据集,突破时空建模与机理融合等五大关键技术,短期径流预测精度较传统机理模型提升5个百分点以上,实现15天中期径流预测精度超85%,推理效率达秒级。基于气象大模型的基础架构与预训练能力,客户可直接在大模型之上开展增量训练与微调,充分利用场站所在区域的高精度历史数据(如3公里、1公里分辨率),针对不同场站和区域的地形地貌与气候特征进行模型调优。

华为云官方博客 381
上一篇: 领百万Token福利!华为开发者空间 Versatile Agent自定义接入华为云MaaS全指导
下一篇: 华为开发者空间:Java 项目 Docker 容器化,云主机实操教程
华为云开发者联盟
华为云开发者联盟 企业官方账号 企业官方账号
博客等级 码龄10年 72万+粉丝 5985原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值