递归 Java语言程序设计 第十八章 (示例代码2)

程序小白,希望和大家多交流,共同学习

//分形,思锐平斯基三角形
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.geometry.Pos;
import javafx.geometry.Point2D;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;

public class SierpinskiTriangle extends Application
{
    @Override
    public void start(Stage primaryStage)
    {
        //思锐平斯基三角形面板
        SierpinskiTrianglePane trianglePane = new SierpinskiTrianglePane();
        TextField tfOrder = new TextField();
        //对文本框中输入的数字进行相应
        tfOrder.setOnAction(e -> {
            trianglePane.setOrder(Integer.parseInt(tfOrder.getText()));
        });
        //设置文本输入框
        tfOrder.setPrefColumnCount(4);
        tfOrder.setAlignment(Pos.BOTTOM_RIGHT);
        //放置控制组件
        HBox hb = new HBox(10);
        hb.getChildren().addAll(new Label("Enter an order: "), tfOrder);
        hb.setAlignment(Pos.CENTER);

        BorderPane pane = new BorderPane();
        pane.setCenter(trianglePane);
        pane.setBottom(hb);

        Scene scene = new Scene(pane, 200, 210);
        primaryStage.setTitle("SierpinskiTriangle");
        primaryStage.setScene(scene);
        primaryStage.show();
        //使用事件监听控制面板和思锐平斯基三角形的大小
        scene.widthProperty().addListener(ov -> trianglePane.paint());
        scene.heightProperty().addListener(ov -> trianglePane.paint());
    }

    //内部类,思锐平斯基三角形面板
    static class SierpinskiTrianglePane extends Pane
    {
        private int order = 0;
        //设置阶数
        public void setOrder(int order)
        {
            this.order = order;
            paint();
        }

        SierpinskiTrianglePane()
        {
        }
        //打印思锐平斯基三角形
        protected void paint()
        {
            Point2D p1 = new Point2D(getWidth() / 2, 10);
            Point2D p2 = new Point2D(10, getHeight() - 10);
            Point2D p3 = new Point2D(getWidth() - 10, getHeight() - 10);

            this.getChildren().clear();

            displayTriangles(order, p1, p2, p3);
        }
        //递归辅助方法
        private void displayTriangles(int order, Point2D p1, Point2D p2, Point2D p3)
        {
            if (order == 0)
            {
                Polygon triangle = new Polygon();
                triangle.getPoints().addAll(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());

                triangle.setStroke(Color.BLACK);
                triangle.setFill(Color.WHITE);

                this.getChildren().add(triangle);
            }
            else
            {
                //打印每个三角形内部的下一个阶层的三角形
                Point2D p12 = p1.midpoint(p2);
                Point2D p23 = p2.midpoint(p3);
                Point2D p31 = p3.midpoint(p1);

                displayTriangles(order - 1, p1, p12, p31);
                displayTriangles(order - 1, p12, p2, p23);
                displayTriangles(order - 1, p31, p23, p3);
            }
        }
    }
}
//递归选择排序
import java.util.Scanner;
import java.util.Arrays;

public class RecursiveSelectSort
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.println("创建一个大小为10的双精度的数组:");
        double[] array = new double[10];
        for (int i = 0; i < 10; i++)
        {
            array[i] = input.nextDouble();
        }

        sort(array);
        System.out.println(Arrays.toString(array));
    }

    //递归辅助方法
    public static void sort(double[] array)
    {
        sort(array, 0, array.length);
    }

    public static void sort(double[] array, int low, int high)
    {
        if (low < high)
        {
            int indexOfMin = low;
            double min = array[low];
            for (int i = low + 1; i < high; i++)
            {
                if (array[i] < min)
                {
                    indexOfMin = i;
                    min = array[i];
                }
            }

            array[indexOfMin] = array[low];
            array[low] = min;

            sort(array, low + 1, high);
        }
    }
}
//递归二分法查找
import java.util.Scanner;

public class RecursiveBinarySearch
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.println("闯进一个有序的大小为10的整型数组:");
        int[] array = new int[10];
        for (int i = 0; i < 10; i++)
        {
            array[i] = input.nextInt();
        }

        System.out.println("输入需要查找的数:");
        int key = input.nextInt();
        System.out.println(key + " 在数组中的下表是:" + recursiveBinarySearch(array, key));
    }

    public static int recursiveBinarySearch(int[] array, int key)
    {
        return recursiveBinarySearch(array, key, 0, array.length - 1);
    }

    public static int recursiveBinarySearch(int[] array, int key, int left, int right)
    {
        if (left > right)
        {
            return -left - 1;
        }

        int mid = (left + right) / 2;

        if (array[mid] < key)
        {
            left = mid + 1;
            return recursiveBinarySearch(array, key, left, right);
        }
        else if (array[mid] == key)
        {
            return mid;
        }
        else
        {
            right = mid - 1;
            return recursiveBinarySearch(array, key, left, right);
        }
    }
}
//计算目录文件大小
import java.util.Scanner;
import java.io.File;

public class DirctorySize
{
    public static void main(String[] args)
    {
        System.out.print("Enter a directory or a file: ");
        Scanner input = new Scanner(System.in);
        String directory = input.nextLine();

        System.out.println(getSize(new File(directory)) + " bytes.");
    }

    public static long getSize(File file)
    {
        long size = 0;
        if (file.isDirectory())//对文件目录的处理
        {
            File[] files = file.listFiles();
            for (int i = 0; files != null && i < files.length; i++)
            {
                size += getSize(files[i]);
            }//15031 bytes.

//          for (int i = 0; i < files.length; i++)
//          {
//              size += getSize(files[i]);
//          }//15126 bytes.

//          for (File newFile : files)
//          {
//              size += getSize(newFile);
//          }//15134 bytes.
            System.out.println("\n");
        }
        else//对文件的处理
        {
            size += file.length();
            System.out.println(file.getName() + " ");
        }

        return size;
    }
}
//F:\java\java语言程序设计\第18章
//汉诺塔问题,网上有很多的介绍,这里就不写介绍了
import java.util.Scanner;

public class TowerOfHanoi
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter number of disks: ");
        int n = input.nextInt();

        System.out.println("The moves are: ");
        moveDisks(n, 'A', 'B', 'C');
    }
    //移动盘子,借助C盘,将所有盘子移动到B柱子上
    public static void moveDisks(int n, char fromTower, char toTower, char auxTower)
    {
        if (n == 1)
        {
            System.out.println("Move disks " + n + " from " + fromTower + " to " + toTower);
        }
        else 
        {
            moveDisks(n - 1, fromTower, auxTower, toTower);
            System.out.println("Move disks " + n + " from " + fromTower + " to " + toTower);
            moveDisks(n - 1, auxTower, toTower, fromTower);
        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值