精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

10種編程語言實現(xiàn)Y組合子

開發(fā) 開發(fā)工具
Y組合子是Lambda演算的一部分,也是函數(shù)式編程的理論基礎。它是一種方法/技巧,在沒有賦值語句的前提下定義遞歸的匿名函數(shù)。即僅僅通過Lambda表達式這個最基本的“原子”實現(xiàn)循環(huán)/迭代,頗有道生一、一生二、二生三、三生萬物的感覺。

 ?一 Y-Combinator

Y組合子是Lambda演算的一部分,也是函數(shù)式編程的理論基礎。它是一種方法/技巧,在沒有賦值語句的前提下定義遞歸的匿名函數(shù)。即僅僅通過Lambda表達式這個最基本的“原子”實現(xiàn)循環(huán)/迭代,頗有道生一、一生二、二生三、三生萬物的感覺。

1 從遞歸的階乘函數(shù)開始

先不考慮效率等其他因素,寫一個最簡單的遞歸階乘函數(shù)。此處采用Scheme,你可以選擇自己熟悉的編程語言跟著我一步一步實現(xiàn)Y-Combinator版的階乘函數(shù)。

(define (factorial n) 
(if (zero? n)
1
(* n (factorial (- n 1)))))

Scheme中 (define (fn-name)) 是 (define fn-name (lambda)) 的簡寫,就像JS中,function foo() {} 等價于 var foo = function() {}。把上面的定義展開成Lambda的定義:

(define factorial 
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))

2 綁定函數(shù)名

想要遞歸地調(diào)用一個函數(shù),就必須給這個函數(shù)取一個名字。匿名函數(shù)想要實現(xiàn)遞歸,就得取一個臨時的名字。所謂臨時,指這個名字只在此函數(shù)體內(nèi)有效,函數(shù)執(zhí)行完成后,這個名字就伴隨函數(shù)一起消失。為解決這個問題,第一篇文章中[1]強制規(guī)定匿名函數(shù)有一個隱藏的名字this指向自己,這導致this這個變量名被強行占用,并不優(yōu)雅,因此第二篇文章[2]借鑒Clojure的方法,允許自定義一個名字。

但在Lambda演算中,只有最普通的Lambda,沒有賦值語句,如何綁定一個名字呢?答案是使用Lambda的參數(shù)列表!

(lambda (factorial) 
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))

3 生成階乘函數(shù)的函數(shù)

雖然通過參數(shù)列表,即使用閉包技術(shù)給匿名函數(shù)取了一個名字,但此函數(shù)并不是我們想要的階乘函數(shù),而是階乘函數(shù)的元函數(shù)(meta-factorial),即生成階乘函數(shù)的函數(shù)。因此需要執(zhí)行這個元函數(shù),獲得想要的階乘函數(shù):

((lambda (factorial) 
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))
xxx)

此時又出現(xiàn)另一個問題:實參xxx,即形參factorial該取什么值?從定義來看,factorial就是函數(shù)自身,既然是“自身”,首先想到的就是復制一份一模一樣的代碼:

((lambda (factorial) 
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))
(lambda (factorial)
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1)))))))

看起來已經(jīng)把自己傳遞給了自己,但馬上發(fā)現(xiàn) (factorial (- n 1)) 會失敗,因為此時的 factorial 不是一個階乘函數(shù),而是一個包含階乘函數(shù)的函數(shù),即要獲取包含在內(nèi)部的函數(shù),因此調(diào)用方式要改成 ((meta-factorial meta-factorial) (- n 1)) :

((lambda (meta-factorial) 
(lambda (n)
(if (zero? n)
1
(* n ((meta-factorial meta-factorial) (- n 1))))))
(lambda (meta-factorial)
(lambda (n)
(if (zero? n)
1
(* n ((meta-factorial meta-factorial) (- n 1)))))))

把名字改成meta-factorial就能清晰地看出它是階乘的元函數(shù),而不是階乘函數(shù)本身。

4 去除重復

以上代碼已經(jīng)實現(xiàn)了lambda的自我調(diào)用,但其中包含重復的代碼,meta-factorial即做函數(shù)又做參數(shù),即 (meta meta) :

((lambda (meta) 
(meta meta))
(lambda (meta-factorial)
(lambda (n)
(if (zero? n)
1
(* n ((meta-factorial meta-factorial) (- n 1)))))))

5 提取階乘函數(shù)

因為我們想要的是階乘函數(shù),所以用factorial取代 (meta-factorial meta-factorial) ,方法同樣是使用參數(shù)列表命名:

((lambda (meta) 
(meta meta))
(lambda (meta-factorial)
((lambda (factorial)
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))
(meta-factorial meta-factorial))))

這段代碼還不能正常運行,因為Scheme以及其他主流的編程語言實現(xiàn)都采用“應用序”,即執(zhí)行函數(shù)時先計算參數(shù)的值,因此 (meta-factorial meta-factorial) 原來是在求階乘的過程中才被執(zhí)行,現(xiàn)在提取出來后執(zhí)行的時間被提前,于是陷入無限循環(huán)。解決方法是把它包裝在Lambda中(你學到了Lambda的另一個用處:延遲執(zhí)行)。

((lambda (meta) 
(meta meta))
(lambda (meta-factorial)
((lambda (factorial)
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))
(lambda args
(apply (meta-factorial meta-factorial) args)))))

此時,代碼中第4行到第8行正是最初定義的匿名遞歸階乘函數(shù),我們終于得到了階乘函數(shù)本身!

6 形成模式

如果把其中的階乘函數(shù)作為一個整體提取出來,那就是得到一種“模式”,即能生成任意匿名遞歸函數(shù)的模式:

((lambda (fn) 
((lambda (meta)
(meta meta))
(lambda (meta-fn)
(fn
(lambda args
(apply (meta-fn meta-fn) args))))))
(lambda (factorial)
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1)))))))

Lambda演算中稱這個模式為Y組合子(Y-Combinator),即:

(define (y-combinator fn) 
((lambda (meta)
(meta meta))
(lambda (meta-fn)
(fn
(lambda args
(apply (meta-fn meta-fn) args))))))

有了Y組合子,我們就能定義任意的匿名遞歸函數(shù)。前文中定義的是遞歸求階乘,再定義一個遞歸求斐波那契數(shù):

(y-combinator 
(lambda (fib)
(lambda (n)
(if (< n 3)
1
(+ (fib (- n 1))
(fib (- n 2)))))))

二 10種實現(xiàn)

下面用10種不同的編程語言實現(xiàn)Y組合子,以及Y版的遞歸階乘函數(shù)。實際開發(fā)中可能不會用上這樣的技巧,但這些代碼分別展示了這10種語言的諸多語法特性,能幫助你了解如何在這些語言中實現(xiàn)以下功能:

如何定義匿名函數(shù);

如何就地調(diào)用一個匿名函數(shù);

如何將函數(shù)作為參數(shù)傳遞給其他函數(shù);

如何定義參數(shù)數(shù)目不定的函數(shù);

如何把函數(shù)作為值返回;

如何將數(shù)組里的元素平坦開來傳遞給函數(shù);

三元表達式的使用方法。

這10種編程語言,有Python、PHP、Perl、Ruby等大家耳熟能詳?shù)哪_本語言,估計最讓大家驚訝的應該是其中有Java!

1 Scheme

我始終覺得Scheme版是這么多種實現(xiàn)中最優(yōu)雅的!它沒有“刻意”的簡潔,讀起來很自然。

(define (y-combinator f) 
((lambda (u)
(u u))
(lambda (x)
(f (lambda args
(apply (x x) args))))))

((y-combinator
(lambda (factorial)
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1)))))))
10) ; => 3628800

2 Clojure

其實Clojure不需要借助Y-Combinator就能實現(xiàn)匿名遞歸函數(shù),它的lambda——fn——支持傳遞一個函數(shù)名,為這個臨時函數(shù)命名。也許Clojure的fn不應該叫匿名函數(shù),應該叫臨時函數(shù)更貼切。

同樣是Lisp,Clojure版本比Scheme版本更簡短,卻讓我感覺是一種刻意的簡潔。我喜歡用fn取代lambda,但用稀奇古怪的符號來縮減代碼量會讓代碼的可讀性變差(我最近好像變得不太喜歡用符號,哈哈)。

(defn y-combinator [f] 
(#(% %) (fn [x] (f #(apply (x x) %&)))))

((y-combinator
(fn [factorial]
#(if (zero? %) 1 (* % (factorial (dec %))))))
10)

3 Common Lisp

Common Lisp版和Scheme版其實差不多,只不過Common Lisp屬于Lisp-2,即函數(shù)命名空間與變量命名空間不同,因此調(diào)用匿名函數(shù)時需要額外的funcall。我個人不喜歡這個額外的調(diào)用,覺得它是冗余信息,位置信息已經(jīng)包含了角色信息,就像命令行的第一個參數(shù)永遠是命令。

(defun y-combinator (f) 
((lambda (u)
(funcall u u))
(lambda (x)
(funcall f (lambda (&rest args)
(apply (funcall x x) args))))))

(funcall (y-combinator
(lambda (factorial)
(lambda (n)
(if (zerop n)
1
(* n (funcall factorial (1- n)))))))
10)

4 Ruby

Ruby從Lisp那兒借鑒了許多,包括它的缺點。和Common Lisp一樣,Ruby中執(zhí)行一個匿名函數(shù)也需要額外的“.call”,或者使用中括號“[]”而不是和普通函數(shù)一樣的小括號“()”,總之在Ruby中匿名函數(shù)與普通函數(shù)不一樣!還有繁雜的符號也影響我在Ruby中使用匿名函數(shù)的心情,因此我會把Ruby看作語法更靈活、更簡潔的Java,而不會考慮寫函數(shù)式風格的代碼。

def y_combinator(&f) 
lambda {|&u| u[&u]}.call do |&x|
f[&lambda {|*a| x[&x][*a]}]
end
end

y_combinator do |&factorial|
lambda {|n| n.zero? ? 1: n*factorial[n-1]}
end[10]

5 Python

Python中匿名函數(shù)的使用方式與普通函數(shù)一樣,就這段代碼而言,Python之于Ruby就像Scheme之于Common Lisp。但Python對Lambda的支持簡直弱爆了,函數(shù)體只允許有一條語句!我決定我的工具箱中用Python取代C語言,雖然Python對匿名函數(shù)的支持只比C語言好一點點。

def y_combinator(f): 
return (lambda u: u(u))(lambda x: f(lambda *args: x(x)(*args)))

y_combinator(lambda factorial: lambda n: 1 if n < 2 else n * factorial(n-1))(10)

6 Perl

我個人對Perl函數(shù)不能聲明參數(shù)的抱怨更甚于繁雜的符號!

sub y_combinator { 
my $f = shift;
sub { $_[0]->($_[0]); }->(sub {
my $x = shift;
$f->(sub { $x->($x)->(@_); });
});
}

print y_combinator(sub {
my $factorial = shift;
sub { $_[0] < 2? 1: $_[0] * $factorial->($_[0] - 1); };
})->(10);

假設Perl能像其他語言一樣聲明參數(shù)列表,代碼會更簡潔直觀:

sub y_combinator($f) { 
sub($u) { $u->($u); }->(sub($x) {
$f->(sub { $x->($x)->(@_); });
});
}

print y_combinator(sub($factorial) {
sub($n) { $n < 2? 1: $n * $factorial->($n - 1); };
})->(10);

7 JavaScript

JavaScript無疑是腳本語言中最流行的!但冗長的function、return等關鍵字總是刺痛我的神經(jīng):

var y_combinator = function(fn) { 
return (function(u) {
return u(u);
})(function(x) {
return fn(function() {
return x(x).apply(null, arguments);
});
});
};

y_combinator(function(factorial) {
return function(n) {
return n <= 1? 1: n * factorial(n - 1);
};
})(10);

ES6提供了 => 語法,可以更加簡潔:

const y_combinator = fn => (u => u(u))(x => fn((...args) => x(x)(...args))); 
y_combinator(factorial => n => n <= 1? 1: n * factorial(n - 1))(10);

8 Lua

Lua和JavaScript有相同的毛病,最讓我意外的是它沒有三元運算符!不過沒有使用花括號讓代碼看起來清爽不少~

function y_combinator(f) 
return (function(u)
return u(u)
end)(function(x)
return f(function(...)
return x(x)(...)
end)
end)
end

print(y_combinator(function(factorial)
return function(n)
return n < 2 and 1 or n * factorial(n-1)
end
end)(10))

注意:Lua版本為5.2。5.1的語法不同,需將 x(x)(...) 換成 x(x)(unpack(arg))。

9 PHP

PHP也是JavaScript的難兄難弟,function、return……

此外,PHP版本是腳本語言中符號($、_、()、{})用的最多的!是的,比Perl還多。

<?php 
function y_combinator($f) {
return call_user_func(function($u) {
return $u($u);
}, function($x) use ($f) {
return $f(function() use ($x) {
return call_user_func_array($x($x), func_get_args());
});
});
}

echo call_user_func(y_combinator(function($factorial) {
return function($n) use ($factorial) {
return ($n < 2)? 1: ($n * $factorial($n-1));
};
}), 10);

10 Java

最后,Java登場。我說的不是Java 8,即不是用Lambda表達式,而是匿名類!匿名函數(shù)的意義是把代碼塊作為參數(shù)傳遞,這正是匿名類所做得事情。

package me.zzp.fn; 

public class YCombinator {
public interface Lambda<E> {
E call(Object... args);
}

public static Lambda<Lambda> yCombinator(final Lambda<Lambda> f) {
return new Lambda<Lambda>() {
@Override
public Lambda call(Object... args) {
final Lambda<Lambda> u = (Lambda<Lambda>) args[0];
return u.call(u);
}
}.call(new Lambda<Lambda>() {
@Override
public Lambda call(Object... args) {
final Lambda<Lambda> x = (Lambda<Lambda>) args[0];
return f.call(new Lambda<Object>() {
@Override
public Object call(Object... args) {
return x.call(x).call(args);
}
});
}
});
}

public static void main(String[] args) {
Lambda<Lambda> y = yCombinator(new Lambda<Lambda>() {
@Override
public Lambda call(Object... args) {
final Lambda<Integer> factorial = (Lambda<Integer>) args[0];
return new Lambda<Integer>() {
@Override
public Integer call(Object... args) {
Integer n = Integer.parseInt(args[0].toString());
if (n < 2) {
return Integer.valueOf(1);
} else {
return n * factorial.call(n - 1);
}
}
};
}
});
System.out.println(y.call(10));
}
}

相關鏈接

[1]http://zzp.me/2011-08-05/recursive-lambda/

[2]http://zzp.me/2012-08-04/clojure-style-lambda-in-common-lisp/

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2013-09-13 14:08:01

2011-04-27 09:12:14

PHPjavascriptjava

2014-06-26 10:14:23

編程語言

2019-10-11 15:46:29

編程語言JavaJavaScript

2020-07-24 09:40:04

C語言OOP代碼

2019-12-02 09:46:02

編程語言JavaJavaScript

2014-03-31 15:26:45

Git代碼托管

2020-02-20 20:30:16

編程語言框架

2015-10-28 09:33:31

程序員崩潰編程語言

2011-08-05 17:54:33

Cocoa Touch 多語言

2022-11-01 18:29:25

Go語言排序算法

2023-05-08 07:55:05

快速排序Go 語言

2020-08-12 08:56:30

代碼凱撒密碼函數(shù)

2013-02-21 17:02:00

C語言

2024-08-29 13:23:04

WindowsGo語言

2015-01-04 13:42:15

編程語言

2020-02-05 17:09:28

編程語言代碼Ruby

2012-03-13 10:40:58

Google Go

2022-05-19 14:14:26

go語言限流算法

2022-10-08 08:15:55

GScriptGo 語言
點贊
收藏

51CTO技術(shù)棧公眾號

国产在线激情| av网站在线免费看| 国内成人自拍| 欧美四级电影网| 中国一级黄色录像| 午夜福利理论片在线观看| 亚洲免费播放| 中文字幕亚洲一区在线观看 | 欧美黑人猛交| 国产色产综合色产在线视频 | 国产精品丝袜在线播放| 色综合天天综合网国产成人综合天 | 99sesese| segui88久久综合9999| 国产精品嫩草影院av蜜臀| 国产不卡一区二区在线观看| 免费视频网站在线观看入口| 国一区二区在线观看| 在线国产精品视频| 加勒比精品视频| 欧美成人精品一级| 色狠狠一区二区三区香蕉| 成人免费a级片| 在线观看免费高清完整| bt欧美亚洲午夜电影天堂| 国产日韩精品电影| 日韩一区二区视频在线| 欧美黄色大片网站| 中文字幕亚洲欧美一区二区三区 | 国内免费精品永久在线视频| 麻豆视频免费在线播放| 欧洲精品一区| 精品国产乱码久久久久久夜甘婷婷| 午夜视频你懂的| av资源一区| 亚洲欧美日韩国产综合| 亚洲成人av动漫| 男人的天堂在线免费视频| 成人毛片老司机大片| 91麻豆国产精品| 一区二区三区播放| 日韩成人午夜精品| 国产成人久久久| 无码人妻久久一区二区三区| 99亚洲伊人久久精品影院红桃| 不卡av电影在线观看| 日韩在线一卡二卡| 成人中文视频| 在线观看精品国产视频| 久久精品三级视频| 日韩理论片av| 日韩有码片在线观看| 日韩黄色中文字幕| 欧美色图激情小说| 中文字幕亚洲字幕| 日韩一级片在线免费观看| 欧美先锋资源| 精品国产欧美一区二区五十路 | 天天做综合网| 萌白酱国产一区二区| 精品人妻伦九区久久aaa片| 国产精品88久久久久久| 久久久久999| 午夜免费激情视频| 欧美色一级片| 97视频在线观看亚洲| 国产 日韩 欧美 在线| 美女精品网站| 国产剧情日韩欧美| 国产精品欧美综合亚洲| 国产精品自在在线| 国产日韩一区欧美| 欧美色18zzzzxxxxx| 欧美国产日本韩| 国产精品h视频| 欧美aaaxxxx做受视频| 午夜电影网亚洲视频| 超碰网在线观看| 国产成人免费精品| 91精品国产麻豆| 国产精品一区二区人妻喷水| 色老板在线视频一区二区| 亚洲色图综合久久| 欧美三级黄色大片| 亚洲美女黄网| 国产精品美乳一区二区免费 | 亚洲欧美色图片| 91导航在线观看| 欧美88av| 日韩av快播网址| 国产人妖在线播放| 99国产精品一区| 亚洲一区影院| yellow字幕网在线| 欧美日韩一级视频| 色婷婷免费视频| 欧美激情欧美| 韩剧1988在线观看免费完整版| 最新中文字幕第一页| 国产91丝袜在线播放0| 欧美日韩国产免费一区二区三区 | 国产va免费精品高清在线| 91精品在线视频观看| 99久久精品国产一区| 亚洲一卡二卡三卡四卡无卡网站在线看| 欧美理论电影| 精品视频1区2区| 亚洲一级av无码毛片精品| 99精品综合| 日本免费一区二区三区视频观看| 国产露脸91国语对白| 久久亚洲一级片| 国产制服91一区二区三区制服| 国模套图日韩精品一区二区| 日韩三级中文字幕| 成年人在线免费看片| 日韩视频一区| 91精品久久久久久蜜桃| 丝袜美腿美女被狂躁在线观看| 精品露脸国产偷人在视频| 天天操夜夜操很很操| 精品一级毛片| 欧美一级视频一区二区| 国内老熟妇对白hdxxxx| 国产精品伦一区二区三级视频| 777久久久精品一区二区三区| 免费看一区二区三区| 中文字幕久久久| 国产午夜精品久久久久| 成人福利在线看| 国产91porn| 日韩大陆av| 在线播放国产一区中文字幕剧情欧美 | 视频一区二区在线播放| 亚洲欧洲av在线| 国产又黄又猛又粗| 国产欧美日韩精品一区二区三区| 91产国在线观看动作片喷水| 午夜精品在线播放| 日韩毛片精品高清免费| 四季av一区二区三区| 日本不卡高清| 国产精品久久久久久五月尺| 精品三级久久久久久久电影聊斋| 五月天中文字幕一区二区| 95视频在线观看| 影音先锋中文字幕一区二区| 国产女主播一区二区| 国产精品国精产品一二| 欧美精品一区二区三区一线天视频 | 亚洲欧美偷拍另类| 91亚洲一区| 91视频国产精品| 二区三区在线观看| 日韩亚洲欧美综合| 日韩视频中文字幕在线观看| 国产精品996| 日本一道在线观看| 精品一区二区男人吃奶| 91成人福利在线| 国产福利电影在线| 欧美日韩电影在线播放| 人妻人人澡人人添人人爽| 国产福利一区二区三区| 久久av综合网| 日韩大片在线免费观看| 日韩免费在线免费观看| aaa在线观看| 91麻豆精品国产91久久久| 九九九免费视频| 99麻豆久久久国产精品免费| 黑森林福利视频导航| 欧美亚洲国产激情| 91免费欧美精品| 波多野结依一区| 亚洲美女av黄| 国产又粗又长视频| 午夜日韩在线观看| 亚洲国产天堂av| 久久91精品久久久久久秒播| 黄色一级大片免费| 亚洲盗摄视频| 成人写真视频福利网| 国产网红在线观看| 亚洲欧洲在线免费| 国产免费无遮挡| 狠狠色狠狠色综合日日五| 99在线视频免费| 国产成人在线网站| www.日日操| 综合五月婷婷| 欧美精品一区二区视频| 成人短视频软件网站大全app| 久久久久免费视频| av中文在线| 亚洲黄色www| 夜夜嗨aⅴ一区二区三区| 亚洲成人综合视频| 三级影片在线观看| 99精品视频在线观看免费| 精品999在线| 国产精品视频久久一区| 桥本有菜av在线| 美女少妇全过程你懂的久久| 亚洲japanese制服美女| 欧美成人h版| 久久久久久中文字幕| 麻豆免费在线观看| 亚洲欧洲在线播放| 天天干,天天操,天天射| 日韩一区二区三区高清免费看看| 日本免费精品视频| 亚洲国产另类精品专区| 777777国产7777777| 国产午夜精品一区二区三区视频| 中文字幕无人区二| 六月丁香婷婷色狠狠久久| 欧美深夜福利视频| 欧美精品一线| www.亚洲一区二区| 成人影视亚洲图片在线| 欧美日韩国产三区| 任你躁在线精品免费| 不卡一卡2卡3卡4卡精品在| 欧美美女福利视频| 国产精品wwwwww| 免费电影日韩网站| 国产91精品久久久久久久| 国产理论电影在线| 欧美日本亚洲视频| 成人短视频在线| 久久精品视频播放| 午夜在线小视频| 少妇av一区二区三区| 国产一级免费在线观看| 亚洲欧美日韩精品| 欧美一区二区视频| 亚洲精品一区中文| 爽爽视频在线观看| 亚洲欧美制服中文字幕| 你懂的在线网址| 精品在线观看国产| 欧美在线观看在线观看| 亚洲女人被黑人巨大进入| 飘雪影视在线观看免费观看 | 麻豆国产精品一区| av中文字幕不卡| www.555国产精品免费| 成人自拍视频在线观看| 麻豆tv在线观看| 国产白丝精品91爽爽久久| 国产乱淫av麻豆国产免费| 高清国产一区二区三区| 手机免费看av片| 久久综合资源网| 受虐m奴xxx在线观看| 国产亚洲精品aa午夜观看| 五月天精品视频| 国产精品拍天天在线| 日韩在线观看免| 亚洲激情图片qvod| 日韩熟女精品一区二区三区| 精品久久久久久国产91| 欧美日韩一级黄色片| 欧美吞精做爰啪啪高潮| 国产又大又黄又爽| 精品国产99国产精品| 亚洲色图欧美视频| 伊人激情综合网| 巨大荫蒂视频欧美大片| 欧美国产日本在线| 成人欧美大片| 国产日韩综合一区二区性色av| 经典三级久久| 国产三区二区一区久久| 欧美日韩水蜜桃| 佐佐木明希av| 国产毛片久久| 亚洲综合欧美在线| 成人午夜av电影| 在线视频第一页| 一区二区免费视频| 亚洲自拍一区在线观看| 制服丝袜日韩国产| 四虎精品成人影院观看地址| 日韩中文在线不卡| 国产亚av手机在线观看| 国产精品草莓在线免费观看| 日本伊人久久| 日韩国产欧美精品| 欧美视频四区| 美女网站视频黄色| 成人激情视频网站| 日本猛少妇色xxxxx免费网站| 亚洲电影一级黄| 中文字幕二区三区| 亚洲成人久久久久| 午夜不卡视频| 欧美一级视频在线观看| 99综合久久| 日本成人黄色免费看| 国产精品九九| 日韩欧美国产片| 91在线高清观看| 青娱乐91视频| 精品视频在线视频| 青青草在线播放| 久久久久久久网站| 国产精品99久久免费| 日韩欧美一区二区三区四区 | 4p变态网欧美系列| 免费一级欧美在线大片| 亚洲欧美一区二区原创| 国产精品综合| 99久久免费看精品国产一区 | 最近2019中文免费高清视频观看www99 | 国产精品一区二区免费在线观看| 美女mm1313爽爽久久久蜜臀| 亚洲av无码一区二区三区网址| 亚洲视频一区在线观看| 超碰在线观看91| 亚洲乱码一区av黑人高潮| av中文字幕在线看| 91免费综合在线| 欧美一二区在线观看| 亚洲人成电影网站色…| 日本欧美在线视频免费观看| 茄子视频成人在线| 国产精品极品国产中出| 看全色黄大色大片| 国产中文一区二区三区| 国产精品久久亚洲7777| 欧美在线观看视频一区| 青青在线视频观看| 91丨porny丨首页| 蜜桃视频最新网址| 欧美在线免费视屏| 国产一区二区影视| 亚洲日韩欧美视频| 欧产日产国产精品视频 | 国产精品久久777777换脸| 亚洲区一区二区| 日韩三级影视| 欧美尤物一区| 日韩精品福利网| 精品成人av一区二区三区| 亚洲午夜成aⅴ人片| 国产伦一区二区| 欧美巨乳美女视频| av不卡一区| 欧美三级在线观看视频| 成人免费黄色在线| 国产成人在线免费观看视频| 亚洲精品97久久| 中文字幕在线官网| 视频一区二区精品| 免费在线看一区| 国产传媒免费在线观看| 欧美日韩成人综合| av在线影院| 不卡视频一区二区| 亚洲影音一区| 日韩av片在线| 91精品国产麻豆| 国产黄大片在线观看| 欧美午夜精品久久久久免费视 | 国产精品久久久久久久av电影 | 成人在线啊v| 成人性生活视频免费看| 久久亚洲私人国产精品va媚药| 国产男人搡女人免费视频| 色噜噜久久综合伊人一本| 日本一区精品视频| 国产l精品国产亚洲区久久| 久久久久久麻豆| 又骚又黄的视频| 欧美国产视频一区二区| 一区二区三区日本久久久| 黄大色黄女片18第一次| 亚洲一区二区在线免费观看视频| 色资源在线观看| 成人精品福利视频| 亚洲无线视频| 亚洲成人黄色av| 日韩三级视频中文字幕| 一区二区精品伦理...| 水蜜桃一区二区三区| 国产成人激情av| 日韩精品在线免费视频| 日韩在线观看免费高清完整版| 日本少妇精品亚洲第一区| 91看片就是不一样| 亚洲柠檬福利资源导航| 偷拍自拍在线| 91免费综合在线| 久久久久久穴| 欧美又粗又大又长| 一区二区av在线| caoporn成人| 91高清国产视频|