为了计算出现次数,例如,使用F#我可以这样做:
let l = [1, 2, 3, 3, 3, 4, 5, 5];
let rec f (l: int list) (n: int) :int =
match l, n with
| [], _ -> 0
| [x], n -> 1
| x::xs when x <> n -> f(xs, n)
| x::xs when x = n -> 1 + f(xs, n)
使用C,我通常使用一个计数器,每次递增时都存储结果,概念上类似于:
i += 1 + f(xs, n);
return i;
请考虑这个问题,我们有无数的蓝色和红色大理石。该函数应计算数字 n个大理石的序列使得三个具有相同颜色的大理石连续不会发生。
#include<stdio.h>
int count(int k, char last, char prev);
int up_count(int n);
int main(int argc, char const *argv[]){
int n;
printf("\n\nNumber of marbles:\n\n");
scanf("%d", &n);
printf("\n\nSequences: %d\n\n", up_count(n));
return 0;
}
int count(int k, char last, char prev){
if(k == 0)
return 1;
else{
if(last == prev)
return (last == 'R') ? count(k - 1, 'B', last) : count(k - 1, 'R', last);
else
return count(k - 1, 'R', last) + count(k - 1, 'B', last);
}
}
int up_count(int k){
return count(k, 'x', 'y');
}
up_count
和count
在哪里存储越来越多的序列?根据我的简短经验,如果没有累加器,该函数应该在基本情况下返回1
。