任何人都可以请我提供一个示例,通过使用几乎相同的示例问题,可以帮助我理解程序,功能,逻辑和面向对象的编程模型。
请使用过程,功能,逻辑和OO编程语言向我提供类似相同问题的示例代码片段。
答案 0 :(得分:11)
http://99-bottles-of-beer.net/
(它以我自己可怕的99语言为特色。)
答案 1 :(得分:10)
让我们尝试更简单的例子 - 只计算第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)
实际上这个问题不值得创建一个类,所以我添加了已经计算过的结果的缓存。
此示例显示:
未显示但我们可以例如从抽象类中返回此类,返回某个序列的第n个成员。通过子类化,我们得到定义Fibonacci序列的类,序列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
的其他实现来证明:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
这里我们将fibs
函数作为参数传递给zipWith
函数。
此示例还演示了延迟评估:“无限”列表仅计算到其他函数所需的范围。
顺便说一下,功能并不一定意味着不是面向对象的。一个功能和面向对象的编程语言的例子是Scala。
的Prolog:
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.
可以看到以下逻辑编程风格的特征:
该程序也可用于发现第8号斐波那契位于序列的第6位:
?- between(0,inf,X), fib(X,8).
X = 6 .
答案 2 :(得分:7)
项目欧拉问题编号2:http://projecteuler.net/problem=2
Haskell(功能/逻辑):
p2 = sum [x | x <- fibs, (x `mod` 2) == 0] where
fibs = unfoldr acc (0,1) where
acc (prev, cur) | (prev+cur) > 4000000 = Nothing
| otherwise = Just (prev+cur, (cur, prev+cur))
Python(OO):
class FibSum(object):
def __init__(self, end):
self.end = end
self.next_two = (1,0)
self.sum = 0
def __iter__(self):
return self
def next(self):
current, previous = self.next_two
self.next_two = (previous+current, current)
new = current+previous
if current >= self.end:
raise StopIteration
elif (new % 2) == 0:
self.sum += new
else:
pass
fibcount = FibSum(4000000)
[i for i in fibcount]
print fibcount.sum
C(程序/命令):
#include <stdio.h>
int main(void)
{
long int sum, newnum, previous = 0;
long int current = 1;
while(current <= 4000000)
{
newnum = previous+current;
if ((newnum % 2) == 0)
{
sum = sum + newnum;
}
previous = current;
current = newnum;
}
printf("%d\n", sum);
}
这是一个用MIT Scheme
编写的非常低效的版本(define (unfold func seed)
(let* ((result (func seed)))
(cond ((null? result) ())
(else (cons (car result) (unfold func (second result)))))))
(define (test x)
(cond ((> (sum x) 4000000) ())
(else (list (sum x) (list (second x) (sum x))))))
(define (sum xs)
(cond ((null? (cdr xs)) (first xs))
(else (+ (car xs) (sum (cdr xs))))))
(sum (filter (lambda (x) (eq? (modulo x 2) 0)) (unfold test (list 0 1))))
Prolog:Take from this here, posted by 13tazer31
fibonacci(_,Current,End,0) :-
Current > End.
fibonacci(Previous, Current, End, Total) :-
divisible(Current, 2),
Next is Current + Previous,
fibonacci(Current, Next, End, Sum),
Total is Sum + Current, !.
fibonacci(Previous, Current, End, Total) :-
Next is Current + Previous,
fibonacci(Current, Next, End, Total).
divisible(Number, 0) :-
write(‘Error: division by 0′).
divisible(Number, Divisor) :-
Number mod Divisor =:= 0.
答案 3 :(得分:1)
非常简单
OO编程逻辑:
现在函数分散在函数逻辑中。当我们将所有相关函数(行为)放在一个伞(Class)中时,我们进一步降低了复杂性..如何... by&#34; Class name&#34;。现在你可以说不是调用f1,f2,f3 ..而是调用c1.f1(),c2.f2,c3.f3(),其中&#34; c&#34;表示一个类(域驱动设计)。
imp ..无论你是使用oops还是功能逻辑,总有一个计算的起点和终点......记住我所谈到的compute()......而问题是谁打电话给它。答案就是你。所有OOP的逻辑或程序逻辑都隐藏在它背后(服务门面)