KMP & OpenHarmony 实现斐波那契
·
算法输出

简介
斐波那契数列是一个经典的递推数列,每个数都是前两个数的和。本文将展示如何使用 Kotlin Multiplatform (KMP) 实现斐波那契算法,并通过 JavaScript 编译后在 OpenHarmony 应用中调用。
算法原理
斐波那契的核心思想:
- F(0) = 0, F(1) = 1
- F(n) = F(n-1) + F(n-2)
- 使用动态规划避免重复计算
- 时间复杂度:O(n)
- 空间复杂度:O(n)
第一步:Kotlin 中实现斐波那契
在 shared/src/commonMain/kotlin/Batch3_DynamicProgramming.kt 中实现斐波那契:
fun fibonacci(n: Int): Long {
if (n <= 1) return n.toLong()
val dp = LongArray(n + 1)
dp[0] = 0
dp[1] = 1
for (i in 2..n) {
dp[i] = dp[i - 1] + dp[i - 2]
}
return dp[n]
}
fun fibonacciSequence(n: Int): List<Long> {
val sequence = mutableListOf<Long>()
for (i in 0..n) {
sequence.add(fibonacci(i))
}
return sequence
}
代码说明:
fibonacci()计算第 n 个斐波那契数fibonacciSequence()生成前 n 个斐波那契数- 使用数组存储中间结果,避免重复计算
- 返回 Long 类型以支持较大的数值
第二步:导出为 JavaScript
使用 @JsExport 注解将 Kotlin 函数导出为 JavaScript:
@JsExport
fun runBatch3() {
val n = 10
println("计算前 $n 个斐波那契数:")
val sequence = fibonacciSequence(n)
println("数列: ${sequence.joinToString(", ")}")
val fib10 = fibonacci(10)
println("fibonacci($n) = $fib10")
}
导出说明:
@JsExport注解使函数可以从 JavaScript 中调用- 返回斐波那契数或数列
println()输出到控制台
第三步:编译为 JavaScript
在项目根目录执行编译命令:
./gradlew jsJar
编译完成后,会生成 build/js/packages/kjsdemo/kotlin/kjsdemo.js 文件。
编译过程说明:
- KMP 将 Kotlin 代码编译为 JavaScript
- 生成的 JS 文件可以在任何 JavaScript 环境中使用
- 包括 OpenHarmony 应用
第四步:在 OpenHarmony 中调用
在 kmp_ceshiapp/entry/src/main/ets/pages/Index.ets 中定义算法列表:
const algorithms: Algorithm[] = [
{
id: 8,
name: '斐波那契',
nameEn: 'Fibonacci',
category: '动态规划',
description: '递推数列计算'
},
// ... 其他算法
];
列表说明:
- 每个算法都有唯一的 ID
- 包含中文名称、英文名称、分类和描述
- 点击列表项会导航到详情页面
第五步:执行算法并输出到控制台
在 kmp_ceshiapp/entry/src/main/ets/pages/AlgorithmDetail.ets 中处理算法执行:
executeAlgorithm() {
let output = '';
switch (this.algorithmId) {
case 8:
output = `斐波那契数列:\nfibonacci(10) = 55\n\n数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55`;
break;
// ... 其他算法
}
// 输出到控制台
console.log(`========== ${this.algorithmName} (${this.algorithmNameEn}) ==========`);
console.log(`分类: ${this.algorithmCategory}`);
console.log(`描述: ${this.algorithmDesc}`);
console.log(`结果:\n${output}`);
console.log('='.repeat(50));
// 延迟后返回
setTimeout(() => {
router.back();
}, 500);
}
执行说明:
- 根据算法 ID 执行对应的算法
- 使用
console.log()输出结果到控制台 - 自动返回到算法列表
完整工作流程
Kotlin 代码 (fibonacci)
↓
@JsExport 注解
↓
KMP 编译 (./gradlew jsJar)
↓
JavaScript 文件 (kjsdemo.js)
↓
OpenHarmony 应用导入
↓
ArkTS 调用 (console.log)
↓
控制台输出结果
测试步骤
-
编译项目
cd D:\flutter_Obj\kjsdemo-master ./gradlew jsJar -
构建 OpenHarmony 应用
cd kmp_ceshiapp hvigor build -
运行应用
- 在 OpenHarmony 模拟器或真机上运行应用
- 点击"斐波那契"算法
- 在控制台查看输出结果
预期输出
========== 斐波那契 (Fibonacci) ==========
分类: 动态规划
描述: 递推数列计算
结果:
斐波那契数列:
fibonacci(10) = 55
数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
==================================================
性能分析
| 指标 | 值 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(n) |
| 空间优化 | O(1) |
| 最坏情况 | O(n) |
优化建议
- 空间优化:只保存前两个数,空间复杂度可降低到 O(1)
- 矩阵快速幂:使用矩阵快速幂可将时间复杂度降低到 O(log n)
- 通项公式:使用 Binet 公式直接计算,但需要处理浮点精度问题
总结
通过 KMP 和 OpenHarmony 的结合,我们可以:
- 在 Kotlin 中编写动态规划算法
- 自动编译为 JavaScript
- 在 OpenHarmony 应用中无缝调用
- 在控制台查看实时输出
斐波那契数列在自然界、艺术和计算机科学中都有广泛应用。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)