递归3_计算多个数字

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    printf("sum = %d",numOfSum(4, 5));


}


/**
 *  
 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
 共有5个数相加),几个数相加有键盘控制。

   f(n) = f(n-1) + aa...a(说明这里有n个a);

 */

int numOfSum(int n,int num){

    if (n == 1) {
        return num;
    }else {
        return numOfSum(n-1,num) + n_mum(n,num);
    }

}
int n_mum(int n,int num) {

    int sum = 0;
    while (n>0) {
        sum = sum*10+num;
        n--;
    }
    return sum;
}

优化版本

/**
 *
 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
 共有5个数相加),几个数相加有键盘控制。

 f(n) = f(n-1) + aa...a(说明这里有n个a);

 f(4,2) = f(3,2) + 2222 = f(3,2) + (f(3,2)- f(2,2))*10 + 2;
 f(n,k) = f(n-1,k) + (f(n-1,k)-f(n-2,k))*10 + k


 */

// n: n个数字 k:1~9 的数
int test2(int n,int k) {

    if (n == 0) {

        return 0;
    }
    if (n == 1) {

        return k;
    }

    return test2(n-1, k) + (test2(n-1, k)-test2(n-2, k))*10 + k;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值