Advertisement

From Arithmetic Sequence To --->>> Pascal’s Triangle And To --->>>N-term Arithmetic Sequence

阅读量:

等差數列入(depths)楊輝三角形並延伸至N階等差數列入,请提前準備好hydrate。本次分享內容豐富且充實,请讓我們一起期待吧!

这次我们从大家十分熟悉的的等差数列开始

一阶等差数列(Arithmetic Sequence):

它是我们再熟悉不过的函数,在计算过程中我们需要明确其递推规律以便能够通过递归方法求取各个参数对应的值

F(N)=F(N-1)+A

二阶等差数列 (second-order arithmetic sequence)

就是差的差是一个定值

(F(N)-F(N-1))-(F(N-1)-F(N-2))=A<<<<=====>>>>F(N)=2×F(N-1)-F(N-2)+A

OK,让我们继续深入

N阶等差数列

OK,为了帮助大家理解,我们现在来看一下三阶等差数列

三阶等差数列

他的递推公式为

((F(N)-F(N-1))-(F(N-1)-F(N-2)))-((F(N-1)-F(N-2))-(F(N-2)-F(N-3)))=A<<<=====>>>

(F(N)-2×F(N-1)+F(N-2))-(F(N-1)-2×F(N-2)+F(N-3))=A<<<====>>>F(N)-3×F(N-1)+3×F(N-2)-F(N-3)=A

而三阶等差数列必须四个参数用于帮助我们确定它

现在我们把从一到三阶的等差数列全部呈现出来

一阶: F(N)-F(N-1)=A

二阶: F(N)-2×F(N-1)+F(N-2)=A

三阶: F(N)-3×F(N-1)+3×F(N-2)-F(N-3)=A

若想构建一个更高阶的等差数列, 首先我们需要深入探讨其递推公式, 其系数实际上是基于杨辉三角的一种变形, 具体而言是在基础型杨辉三角的基础上每个系数乘以 (-1)^(n-1). 这样我们就能更好地理解并掌握构建这种高级等差数列的方法.

支线任务——杨辉三角

所以,我们先写一个组合数的函数,用于计算杨辉三角的系数,Let's go!!!

复制代码
 int factorial(int n)

    
 {
    
 	if (n == 1 ||n==0)
    
 	{
    
 		return 1;
    
 	}
    
 	return n * factorial(n - 1);
    
 }

先写一个计算阶乘的函数,因为后面会频繁用到阶乘

接下来是计算杨辉三角的函数,我们需要行数,和第几个这两个参数

复制代码
 int YHtriangle(int n, int k)

    
 {
    
 	int a = factorial(n);
    
 	int b = factorial(n - k);
    
 	int c = factorial(k);
    
 	return a / (b * c);
    
 }

最终阶段,在程序设计中我们必须要创建一种可变数组(即其元素数量可以在运行期间发生变化的数组)。当我们定义这种数据结构时,在程序实现阶段填入的具体数值必须是一个固定的常量——即使我们对变量有一定的了解并使用了const修饰符来限制其更改次数也无济于事。因此为了实现灵活性与效率并重的目标我们必须采用动态内存分配的方法以确保在运行时可以根据实际需求调整存储空间,并使用malloc函数来完成这一功能。

OK,先来介绍一下malloc函数

在C语言中,malloc函数被用作动态内存分配的标准库函数。通过malloc函数可以在程序运行时动态地为程序分配所需的一块内存空间。然而这并非预先在编译阶段确定内存的具体大小相反它允许我们在运行时灵活配置存储需求为此我们需要调用sizeof运算符来计算所需内存的具体数量以便正确配置malloc函数其所需参数即为待分配内存的大小(以字节计算)。因此我们还必须调用sizeof运算符来计算所需的内存空间并将其传递给malloc函数以便获取指向所分配 memory 块地址的结果变量如果此过程发生错误则会返回NULL值这样我们就可以通过检查返回结果是否为空来判断是否成功完成 memory 分配任务

OK,接下来请看演示

复制代码
 int main()

    
 {
    
     // 我们还发现,第 n 行有 n + 1 个元素
    
     int n = 0;
    
     printf("你要求第几行: ");
    
     scanf("%d", &n);
    
     int* arr = (int*)malloc((n + 1) * sizeof(int));
    
     if (arr == NULL) 
    
     {
    
     printf("内存分配失败\n");
    
     return 1; 
    
     }
    
     for (int i = 0; i < n + 1; i++)
    
     {
    
     arr[i] = YHtriangle(n,i); // 这里可以根据需要初始化数组元素
    
     }
    
     for (int i = 0; i < n + 1; i++)
    
     {
    
     printf("%d ", arr[i]); // 添加空格以便于阅读
    
     }
    
     printf("\n"); 
    
     free(arr);
    
     return 0;
    
 }

接下来,在此之后还需要对结果进行一次处理。

请看

好的,解决了杨辉三角这个支线任务,让我们回到我们的主线任务

主线任务——N阶等差数列

基于之前的推导分析可知

因为N阶等差数列要求有N+1个参数,在让使用者直接输入这些参数显然不太方便的情况下

阶乘

组合数

杨辉三角

N阶等差数列

以下是该函数的所有代码

复制代码
 int YHtriangle(int n, int k)

    
 {
    
     int a = factorial(n);
    
     int b = factorial(n - k);
    
     int c = factorial(k);
    
     return a / (b * c);
    
 }
    
  
    
  
    
  
    
  
    
  
    
 int* N_Arithmetic(int n)
    
 {
    
     int* arr = (int*)malloc((n + 1) * sizeof(int));
    
     if (arr == NULL) 
    
     {
    
     printf("内存分配失败\n");
    
     return NULL;
    
     }
    
     for (int i = 0; i < n + 1; i++) 
    
     {
    
     int coefficient = (i % 2 == 1) ? 1 : -1;
    
     arr[i] = coefficient * YHtriangle(n, i);
    
     }
    
     return arr;
    
 }
    
  
    
  
    
  
    
 int gain(int rank, int position,int gap) 
    
 {
    
     if (position <= rank) 
    
     {
    
     return position;
    
     }
    
     int* coefficient_arr = N_Arithmetic(rank);
    
     if (coefficient_arr == NULL) 
    
     {
    
     return -1; // 错误处理
    
     }
    
     int* funs = (int*)malloc(rank * sizeof(int));
    
     if (funs == NULL) 
    
     {
    
     free(coefficient_arr);
    
     printf("内存分配失败\n");
    
     return -1; // 错误处理
    
     }
    
     int sum = 0;
    
     for (int i = 0; i < rank; i++) 
    
     {
    
     funs[i] = gain(rank, position - (i + 1),gap);
    
     sum += funs[i] * coefficient_arr[i + 1];
    
     }
    
     free(funs);
    
     free(coefficient_arr);
    
     return sum+gap;
    
 }
    
  
    
  
    
  
    
 int main() 
    
 {
    
     int a = 0;
    
     int b = 0;
    
     int c = 0;
    
     printf("几阶等差数列:");
    
     scanf("%d", &a);
    
     printf("公差:");
    
     scanf("%d", &c);
    
     printf("第几项:");
    
     scanf("%d", &b);
    
     int result = gain(a, b, c);
    
     printf("结果是%d\n", result);
    
     return 0;
    
 }

怎么啦?是不是收获了一个充满智慧的大脑?试试看!一起深入探索编程的各种有趣的方法吧!

全部评论 (0)

还没有任何评论哟~