递归与分形图案

递归与分形艺术:从斐波那契到几何图形
本文介绍了递归的概念,包括递归的定义、实例、无限递归的危害以及递归的基本组成部分。接着,文章探讨了分形,展示了如何通过递归生成各种美丽的几何图案,如三角形、线段、正方形、色子形状、陀螺形、环形图案等。文中还提到了分形颜色处理的两种方法,为读者呈现了一种结合数学和艺术的独特视角。

递归与分形

一、递归

1.什么是递归?

递归是函数(方法)自己调用自己。

多个函数相互调用,形成循环调用的过程。

1

methodA(){

methodA();

methodA();

methodA();

methodA();

}

2

methodA(){

methodB();

}

methodB(){

//代码

methodC();

}

methodC(){

//代码

methodB();

}

2.如果递归进入无限递归结果会怎样?

堆栈溢出(错误)

3.在定义递归的时候,必须要设置相应的条件:

1)递归必须要有退出条件

2.)解决同一类问题的集合。

注意: 递归在执行过程中,会不停的开辟内存空间存储数据,所以导致递归的性能非常差。

 

4.递归分为那几部分?

methodA(int i){

//代码1

methodA(i-1);

//代码2

}

while(true){

int i = 10;

}

前段:定义变量对象,计算操作,结束条件

后段:计算操作,返回结果

 

5.举例

斐波那契数列使用递归来实现

1,1,2,3,5,8,13,21,34,...

 

输出10个斐波那契数列,11不计算在内。

Fib(2) = Fib(1)+Fib(1)

Fib(3) = Fib(1)+Fib(2)[Fib(1)+Fib(1)]

Fib(5) = Fib(2)+Fib(3)[Fib(1)+Fib(2)]

public class Fib{
public static void main(String [] args){
Fib f = new Fib();
f.fib(1,1);
}
public void fib(int a,int b){
int i=1;
if(i>10)
return;
i++;
System.out.println(a+"\n"+b+"\n"+(a+b));
fib(a,a+b);
}
}


 

二、分形

分形是递归的应用,运用递归不断的循环,形成非常漂亮的图形。

1.三角形

三角形是先画一个三角形,然后不断的取三遍中点,不断的画,如此循环。

分为上方三角,左边三角,右边三角三个部分,三个递归

int a1,a2,b1,b2,c1,c2;
public void f1(int x1,int x2,int y1){
//画大三角形
int p1,p2,q1,q2,m1,m2,ab,n=3;
ab = Math.abs(x2-x1);
a1 = (x1+x2)/2;
a2 = y1-(int)(ab*Math.pow(3, 0.5)/2);
c1 = x1;
c2 = y1;
b1 = x2;
b2 = y1;
p1 = (a1+c1)/2;
p2 
使用递归实现分形图形的核心思想是:**将一个复杂的结构分解为若干个原结构相似的子结构,并在每个层级上重复这个过程,直到达到最小单位。** --- ## 一、递归的基本思路 ### 分形定义: > 分形是一种具有自相似性质的几何图形,即整体和局部具有相似结构。 ### 实现方式: 1. **基本图案(Base Case)**:定义最简单的图案,比如 `n=1` 的时候就是一个字符 `'X'`。 2. **递归规则(Recursive Rule)**:对于更高层级 `n > 1`,用更小层级的图案组合成当前层级的图案。 3. **拼接策略**:把多个小图按照某种模式拼接到更大的画布中。 --- ## 二、以“X”型分形为例说明递归实现 ### 示例目标: - `n=1`: ``` X ``` - `n=2`: ``` X X X X X ``` - `n=3`: ``` X X X X X X X X X X X X X X X X X X X X X X X X X ``` --- ### 分析规律: - 每一层的大小为 $3^{n-1} \times 3^{n-1}$。 - 每一层由 9 个小块组成(3x3): - 中心不填充; - 其他8个方向放置前一层的图案。 --- ## 三、C++ 递归实现代码详解 ```cpp #include <bits/stdc++.h> using namespace std; typedef vector<vector<char>> Matrix; // 初始化一个全空格的矩阵 Matrix initMatrix(int size) { return Matrix(size, vector<char>(size, ' ')); } // 将小图贴到大图的指定位置 void place(Matrix& dst, const Matrix& src, int x, int y) { int len = src.size(); for (int i = 0; i < len; ++i) for (int j = 0; j < len; ++j) dst[i + x][j + y] = src[i][j]; } // 递归生成分形图案 Matrix generateFractal(int n) { // Base case: 最简单的情况是一个 'X' if (n == 1) { Matrix base(1, vector<char>(1, 'X')); return base; } int prev_size = pow(3, n - 2); // 上一层的大小 Matrix prev = generateFractal(n - 1); // 递归生成上一层 int curr_size = 3 * prev_size; // 当前层大小是上一层的3倍 Matrix curr = initMatrix(curr_size); // 初始化为空白矩阵 // 在3x3的位置中,除了中间,其他都放上一层的图案 for (int dx = 0; dx < 3; ++dx) { for (int dy = 0; dy < 3; ++dy) { if (!(dx == 1 && dy == 1)) { // 跳过中心 place(curr, prev, dx * prev_size, dy * prev_size); } } } return curr; } ``` --- ## 四、主函数调用示例 ```cpp int main() { int N; while (cin >> N && N != -1) { if (N == 0) continue; int size = pow(3, N - 1); Matrix result = generateFractal(N); // 打印结果 for (auto& row : result) { for (char c : row) cout << c; cout << endl; } cout << "-" << endl; } return 0; } ``` --- ## 五、总结:递归实现分形的关键点 | 步骤 | 内容 | |------|------| | 1 | 定义基础图案(Base Case) | | 2 | 递归构造下一层图案 | | 3 | 使用拼接方式组合多份子图案 | | 4 | 控制终止条件避免无限递归 | | 5 | 注意空间管理,防止内存爆炸 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值