多种语言编写杨辉三角(数据结构二维数组方法)
程序员文章站
2022-03-03 20:28:13
Python语言实现杨辉三角杨辉三角是什么...
C语言实现杨辉三角(二维数组)
杨辉三角是什么
杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。(这里中国的老祖宗还是很厉害的)
实现效果
默认状态下不使用金字塔或者菱形输出,多半采用正三角形
题目分析
- 整体上看这是一个正三角行,行和列数是相等的;
-
继续会发现,第一列和对角线上的数字全为1。在二维数组中就可以用
(i==0)和(i==j)
来分别表示第一列和对角线,这是只要在这个条件下输出为1就可以; -
深入研究图形后,我们会看到第i行第j列的数字是由第i-1行第j列的数字加上第i-1行第j-1列的数字构成的,在二位数组里面就是**假设数组名称是array,那么换成代码表示就是
array[i][j]=a[i-1][j]+a[i-1][j-1]
,这个式子是二维数组解决杨辉三角的核心; - 最后完成杨辉三角的构建后,我们还需要将其输出出来,也就是用循环嵌套输出二维数组(我相信这一步没有任何难度)。
代码实现
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[100][100];
int i,j;
int n;
printf("请输入行数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(j==0 || i==j)//在第一列或者在对角线上
{
a[i][j]=1;
}
else
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
//输出杨辉三角
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
只有二维数组这一种方法吗?
当然不是,这是笔者喜欢使用的一种实现杨辉三角的方法,在这里给大家分享,但是杨辉三角还有另一种常见实现方式,那就是递归的方式。还可以用二维数组但不使用循环嵌套而使用递归的方法。总之,达到目的有很多种,但是一定要选择最适合自己的一种。
其他语言的实现方式
笔者阅读了其他多种语言的杨辉三角实现方法,包含了C++、Java、Python、C#、Bash,这里也给大家呈现一下:
C++
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
const int n = 15;
const int m = 2 * n-1;
int arr[n + 1][m] = { 0 };
for (int i = 0; i < n; i++)
{
arr[i][n - i- 1] = 1;
arr[i][n + i -1] = 1;
}
for (int i = 2; i < n; i++)
{
for (int j = n - i + 1; j < n-2+i; j = j + 2)
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j + 1];
}
int p;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
cout << " ";
p = 1;
for (int j = n - i - 1; p < i + 2; j = j + 2)
{
cout << setw(4) << arr[i][j] << " ";
p = p + 1;
}
cout << endl;
}
return 0;
}
Java
public class TriangleArray
{
public static void main(String[] args)
{
final int NMAX = 10;
// allocate triangular array
int[][] odds = new int[NMAX + 1][];
for (int n = 0; n <= NMAX; n++)
odds[n] = new int[n + 1];
// fill triangular array
for (int n = 0; n < odds.length; n++)
for (int k = 0; k < odds[n].length; k++)
{
/*
* compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
*/
int lotteryOdds = 1;
for (int i = 1; i <= k; i++)
lotteryOdds = lotteryOdds * (n - i + 1) / i;
odds[n][k] = lotteryOdds;
}
// print triangular array
for (int[] row : odds)
{
for (int odd : row)
System.out.printf("%4d", odd);
System.out.println();
}
}
}
C#
class Program
{
public int yanghui(int value)
{
if(value<3) return 1;
int[,]arry=new int[value,value];
Console.WriteLine("数组为:");
for(int i=0;i<value;i++)
{
string str="";
str=str.PadLeft(value-i);
Console.Write(str);
for(int j=0;j<=i;j++)
{
if(i==j||j==0)
arry[i,j]=1;
else
arry[i,j]=arry[i-1,j-1]+arry[i-1,j];
Console.Write(arry[i,j]+"");
}
Console.WriteLine();
}
}
static void Main(string[]args)
{
Program p=new Program();
Console.WriteLine("请输入数组值:");
if (p.yanghui(Convert.ToInt16(Console.ReadLine())))
Console.WriteLine("输入数值必须大于3");
Console.Readkey();
}
}
Python
# -*- coding: utf-8 -*-
#!/usr/bin/env python
def triangles():
L = [1]
while True:
yield L
L = [sum(i) for i in zip([0]+L, L+[0])]
该方式用到了列表生成式,理解起来较困难,下面是另一种方式:
def triangles():
ret = [1]
while True:
yield ret
for i in range(1, len(ret)):
ret[i] = pre[i] + pre[i - 1]
ret.append(1)
pre = ret[:]
PHP
<?php
$max = 10;
$L = [1];
var_dump($L);
$L = [1,1];
var_dump($L);
$n = 2;
while ($n <= $max - 1){
$oldL = $L;
$L[$n] = 1;
$n++;
for ($i = 1;$i <count($oldL);$i++){
$L[$i] = $oldL[$i-1] + $oldL[$i];
}
var_dump($L);
}
?>
我们可以清晰的看到,Python语言是多种语言里最方便的代码量最少的,所以大家可以跟着我一起学习Python(同时笔者也在教授高中生Python),在学习Python的过程中,笔者会经常给大家更新和讲解一些经典案例,关注我吧!!
本文地址:https://blog.csdn.net/andaxi/article/details/108703193