数据结构复习:递归入门

本文主要复习了数据结构中的递归概念,引用了《数据结构与算法分析 java语言描述》和《数据结构 殷人昆》两本教材。通过Hanoi塔的c++实现和Java代码,展示了递归的实际应用。此外,还探讨了如何使用递归计算二进制表示中1的个数,以及解决排列组合问题,包括生成n个数字的全排列和n选r的全组合。
摘要由CSDN通过智能技术生成

教材:《数据结构与算法分析 java语言描述》 《数据结构 殷人昆》

java语言版https://github.com/AlexHSL/DS_JAVA.git  

Hanoi塔c++实现:


#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
void Hanoi( int n, string fromTower, string toTower, string auxTower )
{
    if( n == 1 )
    {
        cout << "from " <<  fromTower << " to " << toTower << endl;
    }
    else
    {
        Hanoi( n - 1, fromTower, auxTower, toTower );
        cout << "from " << fromTower << " to " << toTower << endl;
        Hanoi( n - 1, auxTower, toTower, fromTower );
    }
}
int main()
{
    Hanoi( 5, "A", "B", "C" );
}

输入数字,查找该数字二进制表示后1的个数:

#include "pch.h"
#include <iostream>
using namespace std;
int count_num_1( int number )
{
    if( number == 1 )
    {
        return 1;
    }
    else if( number == 0 )
    {
        return 0;
    }
    else
    {
        return count_num_1( number / 2 ) + number % 2;
    }
}
int main()
{
    int num;
    cout << "输入数字,输出该数字二进制表示中1的个数:";
    cin >> num;
    cout << "结果是:" << count_num_1( num );
}

排列组合,输入n个数字,输出n个数字的全排列和n中选取r个数字的全组合

#include "pch.h"
#include <iostream>

using namespace std;

void Perm( int* n, int low, int high )
{
    if( low == high )
    {
        for( int i = 0; i <= high; i++ )
            cout << n[i] << " ";

        cout << endl;
    }
    else
    {
        for( int i = low; i <= high; i++ )
        {
            swap( n[low], n[i] );
            Perm( n, low + 1, high );
            swap( n[low], n[i] );
        }
    }

}
int* res;
void C( int* n, int low, int high, int r, int x )
{


    if( r == 0 )
    {
        for( int i = 0; i < x; i++ )
        {
            cout << res[i] << " ";
        }

        cout << endl;
    }
    else if( high - low == r - 1 )
    {

        res[x] = n[low];
        C( n, low + 1, high, r - 1, x + 1 );

    }
    else
    {
        C( n, low + 1, high, r, x );
        res[x] = n[low];
        C( n, low + 1, high, r - 1, x + 1 );
    }
}
int main()
{
    int n, r;//输入n个数字,取r个
    cout << "先输出n个数字的全排列,再输出从n个数字中取r个数字的所有组合,输入数字个数n和取数个数r:" << endl;
    cin >> n >> r;
    int* numbers = new int[n];
    res = new int[r];
    cout << "输入n个数字" << endl;

    for( int i = 0; i < n; i++ )
    {
        cin >> numbers[i];
    }

    cout << "全排列结果:" << endl;
    Perm( numbers, 0, n - 1 );
    cout << "全组合结果:" << endl;
    C( numbers, 0, n - 1, r, 0 );

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值