用了递归,但是感觉效果不好,时间长
int fib(int n){
if(n==0) return 0;
else if(n==1) return 1;
else return fib(n-1)+fib(n-2);
}
这题不能用第一题的递归方法了,n大了会超出时间限制,用了英雄哥的for循环
int tribonacci(int n){
int F[38];
F[0]=0,F[1]=1,F[2]=1;
for(int i=3;i<=n;++i){
F[i]=F[i-1]+F[i-2]+F[i-3];
}
return F[n];
}
一开始是这样的
int sumNums(int n){
if(n==1) return 1;
else return n+sumNums(n-1);
}
但是题目有要求说不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
所以这里用&&来代替if来判断递归出口
&&是逻辑运算符,逻辑运算具有短路特性。
如:表达式1&&表达式2,若表达式1为假,则不会执行表达式2;相应的还有 表达式1||表达式2,若表达式1为真,则不会执行表达式2。第三题当n=1时,不执行后面的递归函数,直接return 1;
int sumNums(int n){
(n>1)&&(n+=sumNums(n-1));
return n;
}
定义了两个值,一个是增次数,还有一个是减次数。只要这两个值有一个是0,即数列单调。
bool isMonotonic(int* nums, int numsSize){
int up=0,down=0;
for(int i=0;i<numsSize-1;++i){
if(nums[i]>nums[i+1]) down++;
else if(nums[i]<nums[i+1]) up++;
}
return ((down==0)||(up==0))? true:false;
}
也可以这样
bool isMonotonic(int* nums, int numsSize){
int cnt=0,num=0;
for(int i=1;i<numsSize;++i){
int a=nums[i-1],b=nums[i];
if(nums[i-1]>=nums[i]) cnt++;
if(nums[i-1]<=nums[i]) num++;
}
if(cnt==numsSize-1||num==numsSize-1) return true;
else return false;
}