利用非数组的方法输出杨辉三角
大家知道利用數組數組的方法輸出楊輝三角是一件比較容易的事情,在許多的教材上都能夠找到,而且計算速度比較快,但是有個缺點就是當輸出的階數比較大的時候,需要占用較多的存儲空間。 下面我嘗試用利用非數組的方法輸出楊輝三角
1.? 利用公式
學了高中數學我們就知道有公式(a+b)n =C0n a0bn+…+ Ckn akbn-k…+ Cnn anb0
楊輝三角的每一個元素都可以由公式計算出來Ckn akbn-k,有了這個公式我們就可以很快寫出程序來。
?
/***************************************************
?*????? 利用公式輸出楊輝三角
?*????? 編程:zheng??????? 2004.10.27
?*????? 程序在BCB6.0下編譯通過
?***************************************************/
#include "stdio.h"
?
static long factorial(long n)
{//n的階乘
?????? return n==0||n==1?1:n*factorial(n-1);
}//factorial
?
static long getelem(long n,long k)
{//利用公式計算楊輝三角的第row行,col列的元素
???? return factorial(n)/(factorial(n-k)*factorial(k));
}//getelem
?
void output(long n)
{//輸出楊輝三角,n為楊輝三角的階數
?????? int row,col;
?????? for(row=0;row<=n;row++)
?????? {
????????????? for(col=0;col<=row;col++)
???????????????????? printf(" %5ld",getelem(row,col));
????????????? printf("/n");
?????? }//for
}//output
?
2.利用遞歸
觀察下面的楊輝三角(你也可以用上面的性質,通過數學方法推導出來)
???? 1
???? 1???? 1
???? 1???? 2???? 1
???? 1???? 3???? 3???? 1
???? 1???? 4???? 6???? 4???? 1
???? 1???? 5??? 10??? 10???? 5???? 1
???? 1???? 6??? 15??? 20??? 15???? 6???? 1
???? 1???? 7??? 21??? 35??? 35??? 21???? 7???? 1
???? 1???? 8??? 28??? 56??? 70??? 56??? 28???? 8???? 1
???? 1???? 9??? 36??? 84?? 126?? 126??? 84??? 36???? 9???? 1
???? 1??? 10??? 45?? 120?? 210?? 252?? 210?? 120??? 45??? 10???? 1
?
我們可以得到下面的性質(其實我們用數組的方法也是用這個性質)
?
1.?????? 邊界上的元素都是1
2.?????? 中間的任何一個元素都是他的上一行的兩個相鄰元素的和
如果我們用f(n,k)表示楊輝三角的第n行的第k個元素,則上邊的性質可以表示成
f(n,k) =1?? ?(k=0或者n=k)
f(n,k) =f(n-1,k-1)+f(n-1,k)
即
Ckn???=? 1? (k=0或者n=k)
Ckn???= Ck-1n-1???+ Ckn-1
有了上面的性質我們很容易寫出下面的程序
?
?/***************************************************
?*????? 利用遞歸輸出楊輝三角
?*????? 編程:zheng??????? 2004.10.27
?*????? 程序在BCB6.0下編譯通過
?***************************************************/
#include "stdio.h"
?
static long factorial(long n)
{//n的階乘
?????? return n==0||n==1?1:n*factorial(n-1);
}//factorial
?
static long getelem(long n,long k)
{//利用遞歸計算楊輝三角的第row行,col列的元素
?????? if (k==0||n==k) return 1;
?????? else return getelem(n-1,k-1)+getelem(n-1,k);
}//getelem
?
void output(long n)
{//輸出楊輝三角,n為楊輝三角的階數
?????? int row,col;
?????? for(row=0;row<=n;row++)
?????? {
????????????? for(col=0;col<=row;col++)
???????????????????? printf(" %5ld",getelem(row,col));
????????????? printf("/n");
?????? }//for
}//output
?
總結
以上是生活随笔為你收集整理的利用非数组的方法输出杨辉三角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台湾大学林轩田机器学习技法课程学习笔记4
- 下一篇: 程序员都很老实?你错了,其实程序员真实的