第3講-鏈表+重錄計(jì)劃(可報(bào)名),lambda演算用函數(shù)模擬鏈表

零=道=>道;
前繼 = 自然數(shù)=>自然數(shù)();
后繼 = 自然數(shù)=>()=>自然數(shù);
一 = ()=>零;//1
二 = ()=>()=>零;//2
三 = ()=>()=>()=>零;//3
四 = ()=>()=>()=>()=>零;//4
五 = ()=>()=>()=>()=>()=>零;//5
真 = (選擇一,選擇二)=>選擇一();
假 = (選擇一,選擇二)=>選擇二();
如果 = (條件,選擇一,選擇二)=>條件(選擇一,選擇二);
非 = (條件)=>如果(條件,()=>假,()=>真);
或 = (條件一,條件二) =>
如果(條件一,()=>真,()=>如果(條件二,()=>真,()=>假));
與 = (條件一,條件二) =>
如果(條件一,()=>如果(條件二,()=>真,()=>假),()=>假);
為零=(自然數(shù))=>自然數(shù)===零?真:假;
加 = (數(shù)一,數(shù)二) =>
如果(為零(數(shù)二)
,()=>數(shù)一
,()=>加(后繼(數(shù)一),前繼(數(shù)二))
);
減 = (數(shù)一,數(shù)二) =>
如果(為零(數(shù)一)
,()=>零
,()=>如果(為零(數(shù)二)
,()=>數(shù)一
,()=>減(前繼(數(shù)一),前繼(數(shù)二))
)
);
為一 = (自然數(shù)) => 如果(為零(自然數(shù))
,()=>假
,()=>如果(為零(前繼(自然數(shù)))
,()=>真
,()=>假)
);
乘非零 = (數(shù)一,數(shù)二) =>
如果(為一(數(shù)二)
,()=>數(shù)一
,()=>乘非零(加(數(shù)一,數(shù)一),減(數(shù)二,一))
);
乘 = (數(shù)一,數(shù)二) =>
如果(為零(數(shù)二)
,()=>零
,()=>乘非零(數(shù)一,數(shù)二)
);
相等=(數(shù)一,數(shù)二)=>如果(
與(為零(減(數(shù)一,數(shù)二)),
為零(減(數(shù)二,數(shù)一)))
,()=>真
,()=>假);
小于=(數(shù)一,數(shù)二) => 如果(
與(為零(減(數(shù)一,數(shù)二)),
非(為零(減(數(shù)二,數(shù)一))))
,()=>真
,()=>假);
大于=(數(shù)一,數(shù)二) => 如果(
與(非(為零(減(數(shù)一,數(shù)二))),
為零(減(數(shù)二,數(shù)一)))
,()=>真
,()=>假);
// 斐波那契數(shù)
// 第一個(gè)月初有一對(duì)剛誕生的兔子
// 第二個(gè)月之后(第三個(gè)月初)它們可以生育
// 每月每對(duì)可生育的兔子會(huì)誕生下一對(duì)新兔子
// 兔子永不死去
// 過了100個(gè)月,總計(jì)有多少兔子?
//1,1,2,3,5,8,13,……,斐(第88個(gè)月),斐(第89個(gè)月),斐(第88個(gè)月)+斐(第89個(gè)月),
斐波那契數(shù) = (第幾個(gè)月) =>
如果(或(為零(第幾個(gè)月),為一(第幾個(gè)月)),
()=>一,
()=>加(斐波那契數(shù)(減(第幾個(gè)月,一))
,斐波那契數(shù)(減(第幾個(gè)月,二)))
);
展現(xiàn)自然數(shù) = (自然數(shù)) =>
如果(
為零(自然數(shù)),
() => '',
() => 展現(xiàn)自然數(shù)(前繼(自然數(shù))) + '壹'
);
// 鏈表
對(duì)子 = (左,右) => 取子 => 取子(左,右);
取左 = (左,右) => 左 ;
取右 = (左,右) => 右 ;
創(chuàng)建鏈表 = () => 取子 => 取子(真,真);
插入 = (鏈表,元素) => 對(duì)子(鏈表,元素);
鏈表頭 = 創(chuàng)建鏈表();
鏈表一 = 插入(鏈表頭,一);
鏈表二 = 插入(鏈表一,二);
鏈表三 = 插入(鏈表二,三);
鏈表四 = 插入(鏈表三,四);
鏈表五 = 插入(鏈表四,五);
空 = (鏈表)=> 鏈表(取左)===真?真:假;
展現(xiàn)鏈表 = (鏈表,展示方式) => 如果(空(鏈表)
,()=>'頭'
,()=>展現(xiàn)鏈表(鏈表(取左),展示方式) + '->' + 展示方式(鏈表(取右)))
;
展現(xiàn)鏈表(鏈表四,展現(xiàn)自然數(shù));
存在 = (鏈表,條件)=> 如果(空(鏈表)
,()=>假
,()=>如果(條件(鏈表(取右))
,()=>真
,()=>存在(鏈表(取左),條件)
));
展現(xiàn)真假 = (條件)=>如果(條件,()=>'真',()=>'假');
展現(xiàn)真假(存在(鏈表二,(數(shù))=>大于(數(shù),三)));
展現(xiàn)真假(存在(鏈表三,(數(shù))=>大于(數(shù),三)));
展現(xiàn)真假(存在(鏈表四,(數(shù))=>大于(數(shù),三)));
查找 = (鏈表,條件) => 如果(空(鏈表)
,()=>假
,()=>如果(條件(鏈表(取右))
,()=>鏈表(取右)
,()=>查找(鏈表(取左),條件)
));
查找(鏈表一,(數(shù))=>相等(數(shù),三));
查找(鏈表三,(數(shù))=>相等(數(shù),三));
查找(鏈表四,(數(shù))=>相等(數(shù),三));
映射 = (鏈表,條件) => 如果(空(鏈表)
,()=>鏈表
,()=>插入(映射(鏈表(取左),條件),條件(鏈表(取右))));
展現(xiàn)鏈表(映射(鏈表四,(內(nèi)容)=>真),展現(xiàn)真假);
展現(xiàn)鏈表(映射(鏈表四,(內(nèi)容)=>大于(內(nèi)容,二)),展現(xiàn)真假);
逆序臨時(shí) = (鏈表,新鏈表) => 如果(空(鏈表)
,()=> 新鏈表
,()=> 逆序臨時(shí)(鏈表(取左),插入(新鏈表,鏈表(取右)))
)
;
逆序 = (鏈表) => 逆序臨時(shí)(鏈表,創(chuàng)建鏈表());
展現(xiàn)鏈表(逆序(鏈表五),展現(xiàn)自然數(shù));
聚合 = (鏈表,聚方法,處理空) => 如果(空(鏈表)
,()=> 處理空
,()=> 聚方法(聚合(鏈表(取左),聚方法,處理空)
,鏈表(取右))
)
;
// 鏈表求和
聚合(鏈表一,(前,后)=>加(前,后),零);
求和 = (鏈表) => 聚合(鏈表,(前,后)=>加(前,后),零);
聚合(鏈表四,
(前,后)=> 前 + '->' + 展現(xiàn)自然數(shù)(后),
'頭');
展現(xiàn)鏈表 = (鏈表,展現(xiàn)方式) =>
聚合(鏈表,
(前,后)=> 前 + '->' + 展現(xiàn)方式(后),
'頭');
展現(xiàn)自然數(shù)鏈表 = (鏈表) => 展現(xiàn)鏈表(鏈表,展現(xiàn)自然數(shù));