首页 > 解决方案 > 递归函数不返回向量正确列出

问题描述

我正在尝试使用递归函数创建一个包含 10 个介于 1 和 20 之间的唯一随机数的列表。这是代码。

编译器:GNU g++ 10.2.0在 Windows 上

编译器标志:-DDEBUG=9 -ansi -pedantic -Wall -std=c++11

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;

vector<int> random (int size, int range, int randnum, vector<int> randlist ) {
  if (size < 1) {
    cout << "returning...(size=" << size << ")" << endl;
    return randlist;
  }
  else {
    if (any_of(randlist.begin(), randlist.end(),[randnum](int elt) {return randnum == elt;})){
      cout << "repeating number: " << randnum << endl;
      random(size, range, rand() % range + 1, randlist);
      return randlist;
  }
    else {
      cout << "size " << size << " randnum " << randnum << endl;
      randlist.push_back(randnum);
      random(size-1, range, rand() % range + 1, randlist);
      return randlist; }
  }
}


int main (int argc, char *argv[]) {
  srand (time(NULL));
  vector<int> dummy{}; 
  vector<int> uniqrandnums = random(10, 20, (rand() % 20) + 1, dummy );
  cout << "here is my unique random numbers list: " ;
  for_each(uniqrandnums.begin(),uniqrandnums.end(), [](int n){cout << n << ' ';});
  }

为了跟踪唯一的随机数,我cout在递归函数中添加了 2 行random。递归函数似乎运行正确,但无法正确返回结果vector<int列表randlist;它似乎只返回一个列表,其中只有它找到的第一个随机数。

注意:估计函数最终会从这里返回:

  if (size < 1) {
    cout << "returning...(size=" << size << ")" << endl;
    return randlist;
  }

我最初并没有return randlist;在递归函数中添加最后两行,但它给出了编译警告控制到达非无效函数的结尾 [-Wreturn-type]这就是为什么我添加了这两个返回语句但它只是警告消失了,它无助于正确操作。

问题:如何安排代码使递归函数 random 以正确的方式返回完整列表?

标签: c++11recursionvector

解决方案


问题是您正在丢弃对randlist(). 在你打电话的两个地方:

random(..., randlist);
return randlist;

将其替换为:

return random(..., randlist);

推荐阅读