返回顶部
首页 > 资讯 > 前端开发 > VUE >TypeScript中怎么实现一个斐波那契数列
  • 733
分享到

TypeScript中怎么实现一个斐波那契数列

2024-04-02 19:04:59 733人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关typescript中怎么实现一个斐波那契数列,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。const fib&nbs

这篇文章将为大家详细讲解有关typescript中怎么实现一个斐波那契数列,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

const fib = (n: number): number => n <= 1 ? n : fib(n - 1) + fib(n - 2);  for (let i = 0; i < 10; i++) {   console.log(i, fib(i)); }

运行结果如下:

TypeScript中怎么实现一个斐波那契数列

斐波那契数列打印结果

程序完全没问题,完结撒花!

开玩笑的,上面是只一个用了TypeScript类型定义的javascript写法,我们其实真正想这样做&darr;&darr;&darr;, 也就是使用TS  Type解决FIbonacci

import { Fib, Add } from './fib-type';  type one = Fib<1>; type zero = Fib<0>; type Two = Add<one, one>; type Five = Add<Two, Add<Two, one>>; type Fib5 = Fib<Five>; type Fib9 = Fib<9>; type r0 = Fib<Zero>; // type r0= 0 type r1 = Fib<One>; // type r1 = 1 type r2 = Fib<Two>; // type r2 = 1 type r3 = Fib<3>; // type r3 = 2 type r4 = Fib<4>; // type r4 = 3 type r5 = Fib<5>; // type r5 = 5 type r6 = Fib<6>; // type r6 = 8 type r9 = Fib<9>; // type r9 = 34 type sum = Add<r9, r6>; // type sum = 42

TypeScript中怎么实现一个斐波那契数列

类型提示

二、我们该怎么做

要想实现斐波那契数列,参考一开始的代码,有基本的比较, 加法, 循环语法, 所以我们也需要使用类型系统依次实现这三种功能

2.1 加法的实现

为了实现加法, 需要先实现一些工具类型

// 元组长度 type Length<T extends any[]> = T['length']; type one = 1   // 使用extends实现数字相等的比较 type a111 = 0 extends one ? true : false // type a111 = false type a112 = 1 extends one ? true : false // type a112 = true

range的实现是递归实现的

// 伪代码 function range(n, list=[]){   if(n<=0) return list.length   return range(n-1, [1, ...list]) }

TypeScript的限制, 没有循环, 只能用递归代替循环, 后面会有几个类似的写法, 记住一点:递归有几个出口, 对象就有几个 key, 每个 key  就是一个条件

// 创建指定长度的元组, 用第二个参数携带返回值 type Range<T extends Number = 0, P extends any[] = []> = {   0: Range<T, [any, ...P]>;   1: P; }[Length<P> extends T ? 1 : 0];  // 拼接两个元组 type Concat<T extends any[], P extends any[]> = [...T, ...P];  type t1 = Range<3>; // type t1 = [any, any, any]  type Zero = Length<Range<0>>; //   type Zero = 0 type Ten = Length<Range<10>>; // type Ten = 10  type Five = Length<Range<5>>; // type Five = 5  type One = Length<Range<1>>;

有了上面的工具语法,那么实现加法就比较容易了, 只需要求两个元组合并后的长度

type Add<T extends number, P extends number> = Length<    Concat<Range<T>, Range<P>>  >;  type Two = Add<One, One>;  //   type Two = 2  type Three = Add<One, Two>;  // type Three = 3

有了加法,该如何实现减法呢?一般减法和除法都比加法难, 所以我们需要更多的工具类型函数!

2.2 工具函数

2.2.1 实现一些基本工具类型

  • Shift:删除第一个元素

  • Append:在元组末尾插入元素

  • IsEmpty / NotEmpty:判断列表为空

// 去除元组第一个元素 [1,2,3] -> [2,3] type Shift<T extends any[]> = ((...t: T) => any) extends (   _: any,   ...Shift: infer P ) => any   ? P   : [];  type pp = Shift<[number, boolean,string, Object]> // type pp = [boolean, string, Object]  // 向元组中追加 type Append<T extends any[], E = any> = [...T, E]; type IsEmpty<T extends any[]> = Length<T> extends 0 ? true : false; type NotEmpty<T extends any[]> = IsEmpty<T> extends true ? false : true; type t4 = IsEmpty<Range<0>>; // type t4 = true  type t5 = IsEmpty<Range<1>>; // type t5 = false

2.2.2 逻辑类型

  • And:a && b

// 逻辑操作 type And<T extends boolean, P extends boolean> = T extends false   ? false   : P extends false   ? false   : true; type t6 = And<true, true>; // type t6 = true  type t7 = And<true, false>; // type t7 = false  type t8 = And<false, false>; // type t8 = false  type t9 = And<false, true>; // type t9 = false

2.2.3 小于等于

伪代码: 主要思想是同时从列表中取出一个元素, 长度先到0的列表比较短

function dfs (a, b){     if(a.length && b.length){         a.pop()         b.pop()         return dfs(a,b)     }else if(a.length){         a >= b     }else if (b.length){         b > a     } }

思想:将数字的比较转换为列表长度的比较

// 元组的小于等于   T <= P, 同时去除一个元素, 长度先到0的比较小 type LessEqList<T extends any[], P extends any[]> = {   0: LessEqList<Shift<T>, Shift<P>>;   1: true;   2: false; }[And<NotEmpty<T>, NotEmpty<P>> extends true   ? 0   : IsEmpty<T> extends true   ? 1   : 2];   // 数字的小于等于 type LessEq<T extends number, P extends number> = LessEqList<Range<T>, Range<P>>;  type t10 = LessEq<Zero, One>; // type t10 = true type t11 = LessEq<One, Zero>; // type t11 = false  type t12 = LessEq<One, One>; // type t12 = true

2.3 减法的实现

减法有两个思路,列表长度相减求值和数字相减求值

2.3.1 列表减法

默认大减小, 小减大只需要判断下反着来, 然后加个符号就行了, 这里为了简单没有实现,可参考伪代码如下:

// 伪代码 const a = [1, 2, 3]; const b = [4, 5]; const c = []; while (b.length !== a.length) {   a.pop();   c.push(1); }// c.length === a.length - b.lengthconsole.log(c.length);  // 元组的减法 T - P, 同时去除一个元素, 长度到0时, 剩下的就是结果, 这里使用第三个参数来携带结果, 每次做一次减法, 向第三个列表里面追加 type SubList<T extends any[], P extends any[], R extends any[] = []> = {   0: Length<R>;   1: SubList<Shift<T>, P, Apped<R>>; }[Length<T> extends Length<P> ? 0 : 1]; type t13 = SubList<Range<10>, Range<5>>; // type t13 = 5

2.3.2 数字减法

思想:将数字转成元组后再比较

// 集合大小不能为负数, 默认大减小 // 数字的减法 type Sub<T extends number, P extends number> = {   0: Sub<P, T>;   1: SubList<Range<T>, Range<P>>; }[LessEq<T, P> extends true ? 0 : 1];  type t14 = Sub<One, Zero>; //   type t14 = 1 type t15 = Sub<Ten, Five>; // type t15 = 5

我们有了这些工具后, 就可以将一开始用JavaScript实现的斐波那契数列的实现代码,翻译为TypeScript类型编码

三、Fib: js函数 --> TS类型

在JavaScript中,我们使用函数

const fib = (n: number): number => n <= 1 ? n : fib(n - 1) + fib(n - 2);

在TypeScript中,我们使用类型, 其实只是换了一种写法, 用类型函数描述运算, 万变不离其宗~

由于TypeScript递归限制, 并不能求解非常大的项, 不过好玩就完事了~

export type Fib<T extends number> = {   0: T;   1: Add<Fib<Sub<T, One>>, Fib<Sub<T, Two>>>; }[LessEq<T, One> extends true ? 0 : 1];  type r0 = Fib<Zero>; // type r10= 0 type r1 = Fib<One>; // type r1 = 1  type r2 = Fib<Two>; // type r2 = 1  type r3 = Fib<3>; // type r3 = 2  type r4 = Fib<4>; // type r4 = 3  type r5 = Fib<5>; //type r5 = 5  type r6 = Fib<6>; //   type r6 = 8

关于TypeScript中怎么实现一个斐波那契数列就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: TypeScript中怎么实现一个斐波那契数列

本文链接: https://lsjlt.com/news/66706.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • TypeScript中怎么实现一个斐波那契数列
    这篇文章将为大家详细讲解有关TypeScript中怎么实现一个斐波那契数列,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。const fib&nbs...
    99+
    2024-04-02
  • Python中怎么实现一个斐波那契数列
    本篇文章给大家分享的是有关Python中怎么实现一个斐波那契数列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、递归方法输出斐波那契数列第n个元素的值2、用迭代器和生成器获取...
    99+
    2023-06-02
  • 使用javascript怎么实现一个斐波那契数列
    使用javascript怎么实现一个斐波那契数列?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript实现斐波那契数列斐波那契数列,又称黄金分割数列,指的是这样...
    99+
    2023-06-14
  • java中斐波那契数列怎么实现
    本篇内容主要讲解“java中斐波那契数列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中斐波那契数列怎么实现”吧!   斐波那契数列指的是:数...
    99+
    2024-04-02
  • python实现斐波那契数列
    斐波那契数列的发明者是意大利数学家昂纳多.斐波那契(Leonardo Fibonacci)。斐波那契数列又被称为黄金分割数列,或兔子数列。它指的是这样一个数列:0 1 1 2 3 5 8 13 21 34 ....在数学上,斐波那契数列以递...
    99+
    2023-01-31
    数列 python
  • Python怎么实现斐波那契数列
    这篇文章主要介绍“Python怎么实现斐波那契数列”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么实现斐波那契数列”文章能帮助大家解决问题。1、递归方法输出斐波那契数列第n个元素的值2...
    99+
    2023-06-28
  • python3斐波那契数列的实现
    def fib(num): a,b=1,1 while a<num: print(a,end=' ') a,b=b,a+b def fib_tump(...
    99+
    2023-01-31
    数列
  • 怎么用php实现斐波那契数列
    实现方法:1、用数组来求,语法“for($i=0;$i<$n;$i++){if($i==0||$i==1){$arr[$i]=1;}else{$arr[$i]=$arr[$i-1]+$arr[$i-2];}echo $arr[$i];...
    99+
    2023-05-14
    php
  • C语言中斐波那契数列怎么实现
    这篇文章主要介绍“C语言中斐波那契数列怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中斐波那契数列怎么实现”文章能帮助大家解决问题。一、递归    一般来说递归实现...
    99+
    2023-06-28
  • Go语言怎么实现斐波那契数列
    这篇文章主要介绍“ Go语言怎么实现斐波那契数列”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ Go语言怎么实现斐波那契数列”文章能帮助大家解决问题。斐波那契数列以下实例通过 Go 语言的递归函数实...
    99+
    2023-06-19
  • 怎么使用python实现斐波那契数列
    这篇文章主要介绍“怎么使用python实现斐波那契数列”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用python实现斐波那契数列”文章能帮助大家解决问题。斐波那契数列(Fibonacci s...
    99+
    2023-06-27
  • 如何用php实现斐波那契数列
    这篇文章主要介绍了如何用php实现斐波那契数列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用php实现斐波那契数列文章都会有所收获,下面我们一起来看看吧。实现方法:1、用数组来求,语法“for($i=0;...
    99+
    2023-07-05
  • python怎么输出斐波那契数列
    要输出斐波那契数列,可以使用迭代或递归的方法来实现。以下是两种实现方式: 使用迭代方式: def fibonacci(n): ...
    99+
    2024-02-29
    python
  • python递归函数斐波那契数列怎么实现
    斐波那契数列是一个数列,其中每个数字是前两个数字的和,即F(n) = F(n-1) + F(n-2)。递归函数可以用来实现斐波那契数...
    99+
    2023-09-26
    python
  • java递归函数怎么实现斐波那契数列
    实现斐波那契数列的递归函数可以使用以下代码:```javapublic class Fibonacci {public static...
    99+
    2023-08-16
    java
  • c语言斐波那契数列算法怎么实现
    斐波那契数列是指每个数都是前两个数之和的数列,即F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n...
    99+
    2023-10-30
    c语言
  • C语言如何实现斐波那契数列
    这篇文章主要介绍了C语言如何实现斐波那契数列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现斐波那契数列文章都会有所收获,下面我们一起来看看吧。C语言数据结构递归之斐波那契数列首先,关于递归深度,递...
    99+
    2023-06-17
  • java斐波那契数列代码怎么写
    下面是一个Java程序示例,用递归的方式实现斐波那契数列的计算: public class Fibonacci { publ...
    99+
    2024-03-01
    java
  • java中斐波那契数列的简单实现方法
    斐波那契数列指的是:数列的后项等于前两项的和,代码中我们用a[i]=a[i-1]+a[i-2]实现。典型兔子生小兔问题古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对,假设每对小兔子都不死,编程...
    99+
    2021-03-23
    java教程 java 斐波那契数列 实现方法
  • java实现斐波那契数列的三种方法
    斐波那契数列(Fibonacci sequence)的定义:斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,...
    99+
    2017-12-03
    java 斐波那契数列 方法
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作