如果你的boss第一天給你一元錢,后面每一天給你的是前一天的一倍。 也就是說1,2,4,8.... ?,F(xiàn)問到了30天后,你一共拿了多少錢?
要求: 用遞歸函數(shù)來實現(xiàn)
問題很簡單,關(guān)鍵在于思路,下面是代碼。
/*
·遞歸
1. salarySum(n) = salarySum(n-1) + salary(n)
2. salary(n) = 2 ^ (n-1)
·非遞歸
循環(huán)
*/
function salary(nthDay){
return Math.pow(2, nthDay-1)
}
// 遞歸
function salarySum(nthDay) {
if (nthDay > 1) {
return salarySum(nthDay - 1) + salary(nthDay)
} else {
return 1
}
}
// 非遞歸
function salarySum(nthDay) {
let day = 1
let sum = 0
while (day <= nthDay) {
sum += salary(day)
day++
}
return sum
}
哈哈,汗顏,看錯題目
#不遞歸的實現(xiàn)方式
def fn(n):
return 2 ** (n - 1)
#遞歸的實現(xiàn)方式
def fn1(n):
return 1 if n <= 1 else fn1(n-1) * 2
雷雷
第1天:工資[1]總計[1]
第2天:工資[2]總計[3]
第3天:工資[4]總計[7]
第4天:工資[8]總計[15]
天5: 工資[16]總計[31]
第6天:工資[32]總計[63]
第7天:工資[64]總計[127]
第8天:工資[128]總計[255]
第9天:工資[256]總計[511]
第10天:工資[512]總計[1023]
第11天:工資[1024]總計[2047]
第12天:工資[2048]總計[4095]
第13天:工資[ 4096]總計[8191]
第14天:工資[8192]總計[16383]
第15天:工資[16384]總計[32767]
第16天:工資[32768]總計[65535]
第17天:工資[65536]總計[131071]
第18天:工資[131072]總計[262143]
第19天:工資[262144]總計[524287]
第20天:工資[524288]總計[1048575]
第21天:工資[1048576]總計[ 2097151]
第22天:工資[2097152]總計[4194303]
第23天:工資[4194304]總計[8388607]
第24天:工資[8388608]總計[16777215]
第25天:工資[16777216]總計[3355第4431章
第26天:工資[33554432]總計[67108863]
第27天:工資[67108864]總計[134217727]
第28天:工資[134217728]總計[268435455]
第29天:工資[268435456]總計[536] 870911]
天30:工資[536870912]總計[1073741823]
我的思路是:先算出當(dāng)前的金額,然后把今天的日期和金額傳遞下去,直到計算滿30天為止。
function total(all, day,money){
var day = day || 1,
money = money || 0.5;
money *= 2;
// console.log( 'day'+day+': '+ money ); // 輸出當(dāng)前的金額
day++;
if(day<=all){
return money + total(all, day, money);
}
return money;
}
然后調(diào)用total()
即可:
total(1); // 1
total(2); // 3
total(7); // 127
total(30); // 1073741823