gpt4 book ai didi

paradigms - 你能用过程、函数、逻辑和面向对象编程语言来表示同一个例子吗?

转载 作者:行者123 更新时间:2023-12-04 00:11:58 26 4
gpt4 key购买 nike

任何人都可以为我提供一个示例,通过使用几乎相同的示例问题,它可以帮助我并排理解过程、函数、逻辑和面向对象的编程模型。

请给我使用过程、函数、逻辑和 OO 编程语言的一些相同问题的示例代码片段。

最佳答案

让我们试试更简单的例子 - 只计算第 n 个斐波那契数。

首先,程序(在Pascal中):

program Fibonacci;

function fib(n: Integer): Integer;
var a: Integer = 1;
b: Integer = 1;
f: Integer;
i: Integer;
begin
if (n = 1) or (n = 2) then
fib := 1
else
begin
for i := 3 to n do
begin
f := a + b;
b := a;
a := f;
end;
fib := f;
end;
end;

begin
WriteLn(fib(6));
end.

此示例显示了过程语言的功能:
  • 有一些子程序(本例中的函数)
  • 变量可能被多次赋值( := 运算符)
  • 有循环(在这种情况下 用于 运算符)
  • 语言是命令式的,即我们告诉计算机按什么顺序做什么

  • 二、面向对象(在Python中):
    class Fibonacci:
    def __init__(self):
    self.cache = {}
    def fib(self, n):
    if self.cache.has_key(n):
    return self.cache[n]
    if n == 1 or n == 2:
    return 1
    else:
    a = 1
    b = 1
    for i in range(2, n):
    f = a + b;
    b = a;
    a = f;
    self.cache[n] = f;
    return f;


    fibonaccyCounter = Fibonacci()
    print fibonaccyCounter.fib(6)

    其实这个问题不值得创建一个类,所以我添加了对已经计算结果的缓存。

    此示例显示:
  • 类及其实例化(创建实例)
  • 类有自己的内存部分,自己的状态( self 及其成员)
  • 语言是命令式的,即我们告诉计算机按什么顺序做什么

  • 未显示,但我们可以例如从返回某个序列的第 n 个成员的抽象类继承这个类。通过 subslasing,我们得到了定义斐波那契数列、序列 1、2、3...、序列 1、4、9、16 等的类。

    三、函数式风格(Haskell):
    import Text.Printf

    fib :: Int -> Int
    fib 0 = 0
    fib 1 = 1
    fib n = fib (n-1) + fib (n-2)

    main = printf "%d\n" (fib 6)

    展示了函数式编程范式的以下特征:
  • 没有状态,没有变量 - 只是定义了函数
  • 没有循环 - 只有递归
  • 模式匹配:我们分别为其余数字定义了“fib 0”、“fib 1”和“fib n”,没有像这样的结构。如果 需要
  • 声明式风格 - 我们没有定义计算步骤的顺序 函数值:给定函数定义,编译器/解释器/运行时自己计算出来。我们告诉计算机我们想要什么,而不是做什么。
  • 懒惰的评价。如果 main 仅调用“fib 2”,则不会调用“fib n”,因为函数仅在需要将其结果作为参数传递给其他函数时才进行评估。

  • 但是函数式语言的主要特征是函数是一等对象。
    这可以通过 fib 的其他实现来证明。 :
    fib n = fibs!!n
    fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

    我们路过 fibs函数作为 zipWith 的参数功能。
    此示例还演示了惰性求值:“无限”列表仅在其他函数需要的范围内进行计算。

    顺便说一下,函数式并不一定意味着不是面向对象的。 Scala 是一个既面向函数又面向对象的编程语言的例子。

    序言:
    fib(1, 1).
    fib(2, 1).


    fib(X, Y):-
    X > 1,
    X1 is X - 1,
    X2 is X - 2,
    fib(X1, Z),
    fib(X2, W),
    Y is W + Z.


    main :-
    fib(6,X), write(X), nl.

    可以看出以下逻辑编程风格的特点:
  • 语言是陈述性的。就像在函数式风格中一样,我们定义事物而不是告诉它们以什么顺序去做。
  • 但是与函数式风格的区别在于我们定义的是谓词,而不是函数。在这种情况下,谓词 fib(X, Y) 表示“第 X 个斐波那契数为 Y”。给定一些已知的谓词(fib(1, 1) 和 fib(2, 1) - 即第一个斐波那契数是 1,第二个斐波那契数是 1)和推断其他谓词的规则(Y 是 X-th 斐波那契数是 Y 是一个X-1th Fibonacci 数和 X-2th Fibonacci 数之和),Prolog 推断出有问题的谓词。其实答案可能不止1个!
  • 没有输入值和返回值——我们定义了“输入”和“输出”之间的关系,而不是这个。

  • 这个程序也可以用来找出斐波那契数 8 在序列中的第 6 位:
    ?- between(0,inf,X), fib(X,8).
    X = 6 .

    关于paradigms - 你能用过程、函数、逻辑和面向对象编程语言来表示同一个例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592505/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com