【问题标题】:Recursively storing integers in an array递归地将整数存储在数组中
【发布时间】:2018-03-07 18:38:40
【问题描述】:

递归函数有问题。

我必须构建一个递归函数,它创建一个与给定数字的数字相对应的整数值数组。

例如,如果我输入一个像 3562 这样的数字,它应该是这样的:

myArray[0] = 3
myArray[1] = 5
myArray[2] = 6
myArray[3] = 2

这是我的代码:

#include <iostream>
using namespace std;

int myFunction(int num, int lenOfNum);

int main(){
    int number;
    int lengthCount = 0;
    cout <<"Input numbers" << endl;
    cin >> number;
    int temp = number;
    for(; number != 0; number /= 10, lengthCount++);        
    number = temp;  
    cout << myFunction(number, lengthCount) << endl;            
}  

int myFunction(int num, int lenOfNum){
    int arr[lenOfNum];
    if(num > 0){
        for(int i = 0; i < lenOfNum; i++){
            arr[i] = num/=10;
            cout << "arr[" << i + 1 << " ]= " << arr[i] << endl;
        }
        return myFunction(num, lenOfNum);
    }
    else if(num == 0){
        return 0;   
    } else; 
}

【问题讨论】:

  • 您似乎忘记在问题中包含问题。
  • int arr[lenOfNum]; 是一个非标准的供应商编译器扩展。请改用new[]std::vector。但是你不想在每次调用函数时都创建一个新数组。在main 中创建一个数组,然后将其传递给要填充的函数。并且您需要从后到前填充数组,而不是从前到后,否则数字将按倒序存储(2, 6, 5, 3 而不是3, 5, 6, 2
  • 使用 std::vector - 使用 std:vector 生活总是更美好

标签: c++ arrays recursion integer


【解决方案1】:

您的代码的问题是您在每个方法调用中都调用了int arr[lenOfNum],简而言之,这会创建一个数组,其中包含对可以存储 lenOfNum 整数的内存位置的新引用。

为了解决这个问题,我们在 main 方法中声明数组并将其作为参数传递给函数。

int main() { 
    // somewhere in main after reading lenOfNum
    int arr[lenOfNum];
    // somewhere in main after declaring an array
    myFunction(arr, number, lengthCount - 1);
}

和 myFunction 一样

void myFunction(int *arr, int num, int idx) {
    if (idx < 0) return;  // you've completed processing the num
    else if (num == 0) {
        arr[0] = 0;
        return;
    }

    arr[idx--] = num % 10;
    myFunction(arr, num / 10, idx);
}

【讨论】:

  • 与其在num &lt;= 0 上结束递归,我可能会在idx &lt; 0 上结束它。如果用户实际输入"0" 作为输入怎么办?如果cin &gt;&gt; number 成功,则必须将lengthCount 初始化为1 而不是0 以说明arr[0] = 0
  • 我的错,实际上并没有运行代码,只是想通了,感谢各位领导,处理了那个案子:)
  • 不过,您处理得并不好。我仍然认为idx &lt; 0 会做出更好的结束条件:void myFunction(int *arr, int num, int idx) { if (idx &lt; 0) return; arr[idx--] = num % 10; myFunction(arr, num / 10, idx); }
【解决方案2】:

使用示例的向量和其余部分

#include <iostream>
using namespace std;

void myFunction(vector<int> &arr, int num, int lenOfNum){
    if (num < 0) {
        return;
    }
    else if (num == 0) {
        return;
    }
    int next_idx = lenOfNum - 1;
    int digit = num % 10;
    arr[next_idx] = digit;
    myFunction(arr, num / 10, next_idx);
}


int main(){
    int number;
    int lengthCount = 0;
    cout <<"Input numbers" << endl;
    cin >> number;
    int temp = number;
    for(; number != 0; number /= 10, lengthCount++);        
    number = temp;  

    auto arr = vector<int>(lengthCount, 0);
    myFunction(arr, number, lengthCount);
    for(int i = 0; i < arr.size(); i++){
         cout << "arr[" << i << " ]= " << arr[i] << endl;
    }
}  

【讨论】:

    【解决方案3】:

    适用于正数

    #include <vector>
    #include <stdio.h>
    
    std::vector<int> myFunction(int num)
    {
      std::vector<int> ret;
      int irec = num / 10;
      if (irec > 0)
         ret = myFunction(irec);
      ret.push_back('0' + (num % 10));
      return ret;      
    }
    
    int main(int argc, char *argv[])
    {
        std::vector<int> res = myFunction(539);
        for(unsigned int i = 0; i < res.size(); i++)
            printf("%c,", res[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2013-12-13
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多