如何在不使用数组的情况下用C语言实现并显示Aitken’s array
如何在不使用数组的情况下显示Aitken数组?
Aitken数组是一个数字三角形{aₙ,ₖ, n ≥ 0, 0 ≤ k ≤ n},按行读取,定义规则如下:
- a₀,₀ = 1
- aₙ,₀ = aₙ₋₁,ₙ₋₁(每行第一个元素等于上一行的最后一个元素)
- aₙ,ₖ = aₙ,ₖ₋₁ + aₙ₋₁,ₖ₋₁(每行后续元素等于当前行前一个元素加上上一行对应位置的元素)
其前5行示例如下:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
你提供的代码逻辑存在问题,无法正确生成符合规则的Aitken数组。以下是修正后的实现,无需使用数组,仅通过几个变量递推完成:
#include <stdio.h> int main() { int num_rows = 5; // 要输出的行数(从n=0到n=4) int prev_last = 1; // 存储上一行的最后一个元素,作为当前行的第一个元素 printf("%d\n", prev_last); // 递推上一行元素的变量:prev_prev是上一行的前一个元素,prev_curr是上一行的当前元素 int prev_prev = 1; int prev_curr = 1; // 生成第1行到第num_rows-1行 for (int n = 1; n < num_rows; n++) { int curr = prev_last; // 当前行第一个元素 printf("%d", curr); // 生成当前行剩余的n个元素 for (int k = 1; k <= n; k++) { // 按规则计算当前行下一个元素 curr = curr + prev_prev; printf(" %d", curr); // 更新上一行的递推变量,为下一次计算准备 int temp = prev_curr; prev_curr = prev_curr + prev_prev; prev_prev = temp; } printf("\n"); // 更新上一行的最后一个元素为当前行的最后一个元素 prev_last = curr; } return 0; }
代码说明
prev_last:专门存储上一行的最后一个元素,直接作为当前行的第一个元素,满足aₙ,₀ = aₙ₋₁,ₙ₋₁的规则。prev_prev和prev_curr:通过递推维护上一行的元素序列,因为上一行的每个元素等于其前一个元素加上上上行的对应元素,用这两个变量就可以避免存储整个数组。- 外层循环:控制总行数,从第1行开始生成(第0行已直接输出)。
- 内层循环:生成当前行的后续元素,每一步都按规则计算,同时更新上一行的递推变量,确保后续计算能正确获取上一行的对应元素。
运行该代码后,会输出与示例完全一致的Aitken数组。
内容的提问来源于stack exchange,提问作者Mashrafe Uddin
相关产品推荐
相关产品推荐

