細胞分裂
細胞分裂 有一個細胞 每個小時分裂一次,一次分裂一個子細胞,第三個小時後會死亡。那麼n個小時候有多少細胞?
這個問題的核心就是
三個小時爲一個週期
// 每三個小時爲一個週期 , 第四個小時就 go die 了。
// 方法一
// 第一個小時,只有a態細胞;第二個小時,a態細胞分裂,原來的a態細胞變成了b態細胞,分裂出來的細胞變成了新的a態細胞;第三個小時,a態細胞繼續分裂變成b態細胞和新的a態細胞,b態細胞分裂變成c態細胞和a態細胞;第四個小時,a、b、c態細胞都會分裂,而且按照以前的規律轉變。得出下面的結論
// a 初始態 一個小時 前一個小時的 a+b+c
// b 幼年態 兩個小時 前一個小時的 a
// c 成熟態 三個小時 前一個小時的 b
function allCell(n){
// a態細胞
let aCell = function(n){
if(n==1){
return 1;
}else{
return aCell(n-1)+bCell(n-1)+cCell(n-1);
}
}
// b態細胞
let bCell = function(n){
if(n==1){
return 0;
}else{
return aCell(n-1);
}
}
// c態細胞
let cCell = function(n){
if(n==1||n==2){
return 0;
}else{
return bCell(n-1);
}
}
return aCell(n)+bCell(n)+cCell(n)
}
console.log(allCell(10))
// 方法二
// 這個方法就是分紅了 活着的 和 死亡的
function cell(hour){
// 活着的細胞
function livecell(hour){
if(hour<4){
// 前三個小時沒有死亡的細胞 成2的n-1次方增加
return Math.pow(2,hour-1)
}else{
// 從第四個小時開始有死亡的細胞
// 活着的細胞 = 前一個小時活着的細胞 - 這個小時死去的細胞
return livecell(hour-1)*2 - diecell(hour)
}
}
// 死亡的細胞
function diecell(hour){
if(hour<4){
// 前三個小時沒有死亡的細胞
return 0
}else{
// 由於三個小時一個週期
// 也就是每三個小時,(n-3)時的細胞就會死完
// 那麼 這個小時(n)死去的細胞 + 上個小時(n-1)死去的細胞 + 前兩個小時(n-2)死去的細胞 = 前三個小時(n-3)活着的細胞
return livecell(hour-3) - diecell(hour-1) - diecell(hour-2)
}
}
return livecell(hour)
}
console.log(cell(10))
斐波那契數列
又稱兔子數列,是以兔子繁殖爲例,得出這樣一個數列:1,1,2,3,5,8... 指從第三個值開始,每一個值都是前兩個值的和。
// 遞歸
let a = 0;
function tu(num){
a++
if(num==1||num==2){
return 1
}
let nums = tu(num-1)+tu(num-2)
return nums
}
console.log(tu(8),a)
// 閉包解決
// 也就是存在數組中,再次循環時,若是數組中已經存在,就返回數組中的值,大大減小了遞歸調用函數的次數
var count2=0;
var fiba = (function(){
var arr = [0,1,1]; //第0位只是佔位,從第一位開始算起
return function(n){
count2++;
var res=arr[n];
if(res){// 若是arr中存在,返回這個值
console.log(res,'----')
return res;
}else{
console.log(arr[n],'+++++')
arr[n]=fiba(n-1)+fiba(n-2);
return arr[n];
}
}
})();
console.log(fiba(8),count2)
// 普通
// 普通循環解決這個問題是性能最好的。
let a = 1;
let b = 1
let c;
function tu(num){
for(let i=0;i<num-2;i++){
c = a+b;
a = b;
b = c
}
return c;
}
console.log(tu(8))
64格子
有 64 個格子,第一個格子放一粒麥子,第二個放2粒,第三個放4粒...每一個格子都是前邊的兩倍。一共有多少粒?
let sum = 0
let start = 1;
let end = 0;
function tow(){
if(end>=64){
return false
}
sum+=start
start*=2
end++
tow()
}
tow()
console.log(sum)
使用遞歸實現數組快速排序方法
這個問題的核心思想是 取中間值,然大的放一邊,小的放一邊,而後再對兩邊執行同樣的操做,也就是遞歸了。
var mysort = function(arr){
// 結束條件
if(arr.length<=1){
return arr
}
// 找基準值 數組中間值
// 求下標
var center = Math.floor(arr.length/2)
var jZ = arr.splice(center,1)[0]
// 建立兩個空數組
var left = [] , right = [];
// 循環數組,並進行比較
for(var i=0;i<arr.length;i++){
if(arr[i]<jZ){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return mysort(left).concat([jZ],mysort(right))
}
console.log(mysort([1,6,4,3,7,8,9]))
九九乘法表
// 遞歸
function num(nums){
if(nums==1){
console.log("1x1=1")
}else{
num(nums-1)
for(var i=1,str='';i<=nums;i++){
str += `${i}x${nums}=`+i*nums+' '
}
console.log(str)
}
}
num(9)
// 循環
for(var i=1;i<10;i++){
let str = ''
for(var j=1;j<10;j++){
if(i>=j){
str += `${j}x${i}=`+i*j+' '
}
}
console.log(str)
}