任何人都可以请给我一个例子,通过使用几乎相同的示例问题,可以帮助我理解程序,功能,逻辑和面向对象的编程模型.
请使用过程,功能,逻辑和OO编程语言给我一些相同问题的示例代码片段.
Ale*_*rev 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.
Run Code Online (Sandbox Code Playgroud)
此示例显示了过程语言的功能:
二,面向对象(用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)
Run Code Online (Sandbox Code Playgroud)
实际上这个问题不值得创建一个类,所以我添加了已经计算过的结果的缓存.
此示例显示:
没有显示,但我们可以例如从抽象类中返回此类,返回某个序列的第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)
Run Code Online (Sandbox Code Playgroud)
演示了函数式编程范例的以下特性:
但是函数式语言的主要特征是函数是第一类对象.这可以通过以下其他实现来证明fib:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
这里我们将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.
Run Code Online (Sandbox Code Playgroud)
可以看到以下逻辑编程风格的特征:
该程序还可用于发现Fibonacci数字8位于序列的第6位:
?- between(0,inf,X), fib(X,8).
X = 6 .
Run Code Online (Sandbox Code Playgroud)
项目欧拉问题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))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个用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))))
Run Code Online (Sandbox Code Playgroud)
Prolog:从这里开始,由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.
Run Code Online (Sandbox Code Playgroud)