递归算法2

编写一个函数实现n^k,使用递归实现

输入

输入为一行,给出n和k的值

输出

输出为一行,给出n^k的结果

 

样例输入

4 2

 样例输出 

16

分析思路(从后往前推):

假设n=4,k=5

 

n^5 = n * n4 \\ n^4 = n * n^3\\ n^3 = n * n^2\\ n^2 = n * n^1\\ n^1 = n
#include <iostream>

using namespace std;

int f(int n ,int k){
    if (k == 1){
        return n;
    }
    return n*f(n,k-1);
}

int main(){
	int n,k;
    cin >> n >> k;
    cout << f(n,k) << endl;
}

使用递归的方式,倒序输出一个正整数

输入

输入为一行,给出一个整数

输出

输出为一行,输出整数倒序的结果

 

样例输入

456789

 样例输出 

987654

分析思路:

1.取出整数的个位数,将剩下的数字进行递归

2.当剩下的数小于10时,递归停止,并继续输出

#include <iostream>

using namespace std;

void f(int n){
    cout << n % 10 ;
    if (n > 10){
        f (n / 10);
    }
    
}

int main(){
    int n;
    cin >> n;
    f(n);
}

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

输入: 38
输出: 2 
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

分析思路

1.取出每一位数进行相加

2.判断相加的结果是否大于10,如果大于10,则继续递归,否则直接退出

#include <iostream>

using namespace std;

int f(int n){
    int s = 0;
    while (n >= 10){
        s += n %10;
        n /= 10;
    }

    s += n;

    if ( s >= 10){
        return f(s);    //如果大于10,则继续递归
    }else{
        return s;       //如果小于10,则直接得出答案
    }
}

int main(){
    int n;
    cin >> n;
    cout << f(n);
}

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
 

汉诺塔问题

给出一个整数n,代表有n个纸片,有三根柱子:A、B、C

输出每一次纸片移动时,起始和结束的柱子编号

汉诺塔问题

问题分析:

假设有2个盘子,从上到下依次编号1,2

1.先把1放到B

2.再把2放到C

3.再把1放到C,完成移动

问题分析:

假设有3个盘子,从上到下依次编号1,2,3

1.先把1,2放到B

2.再把3放到C

3.再把1,2放到C,完成移动

  #include <iostream>

  using namespace std;

  void hanota(int n,char from,char temp,char to){
      if (n > 0){
          hanota(n-1,from,to,temp);
          cout << from << "->" << to << endl;;
          hanota(n-1,temp,from,to);
      }
  }

  int main(){
      hanota(3,'A','B','C');
  }

答案与结果

Level2_2_2递归算法

By yang he

Level2_2_2递归算法

  • 200