【问题标题】:What error did i make writing my recursive function using arrays?我使用数组编写递归函数时犯了什么错误?
【发布时间】:2021-08-10 04:04:49
【问题描述】:
#include <stdio.h>
#include <math.h>

int prod(int arr[], int n) {
    
    if (arr[n-1] < 0) {
        return 1;
    }

   return ((arr[n-1]) * (prod(arr[n-2] , n)));

}

int main( int argc, char* args[] ) {

    int arr[] = {2 , 3};

    printf("%d" , prod(arr , 2));
}

我不断收到与指针相关的错误,但不知道要更改什么,有什么帮助吗?该代码应该使用递归函数来获得数组中所有等于或大于0的整数的乘积。

【问题讨论】:

  • arr[n-1] &lt; 0 - 什么时候满足这个条件?
  • prod(arr[n-2] , n) - 此调用无效。该函数需要一个数组,但您将其改为 [n-2]'s 元素
  • 修复编译器警告而不是忽略它们。
  • 一般来说,在创建递归函数时,最好从您尝试实现的数学递归规则开始。例如,数组产品的规则将是:prod(Arr, Len) = Arr[Len-1] * prod(Arr, Len-1) for Len &gt; 0prod(Arr, 0)=1

标签: arrays c recursion function-definition


【解决方案1】:

我猜递归终止的条件应该是:

if (n-1 < 0) {
        return 1;
}

可以改写为:

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

这意味着空数组条目的乘积是1。 此外,更深入的表达应该是:

return arr[n-1] * prod(arr , n - 1);

最终的代码可能是:

int prod(int arr[], int n) {
    if (n == 0)
        return 1;
    return arr[n-1] * prod(arr, n - 1);
}

【讨论】:

  • 不敢相信我犯了这种错误,无论如何都想出了如何解决它,感谢您的帮助
【解决方案2】:

prod 函数中应该有这样的赋值:-

n=n-1

您不会在任何地方减少 n 的值。

【讨论】:

  • 这绝不是唯一的主要问题。
  • 这是我在 0 焦点下尝试的工作,刚刚发现我的错误有多愚蠢,谢谢指出
【解决方案3】:

这个函数不正确。

int prod(int arr[], int n) {
    
    if (arr[n-1] < 0) {
        return 1;
    }

   return ((arr[n-1]) * (prod(arr[n-2] , n)));

}

对于初学者来说,这个 if 语句

if (arr[n-1] < 0) {
    return 1;
}

没有意义。

看来你的意思

if ( n-1 < 0) {
    return 1;
}

在这个表达式中

prod(arr[n-2] , n)

第一个参数是int 类型的标量对象。也就是说arr[n-2] 是数组的一个元素。第二个参数也应该递减,即你必须使用表达式n - 1

但除此之外还有其他几个缺点。

对于初学者来说,数组元素的乘积可能太大而无法放入 int 类型的对象中,您至少应该使用类型 long long int 作为返回函数类型,或者可能使用浮点类型 @987654330 @。

其次,由于数组没有在函数内更改,所以第一个参数应该有限定符 const。

用户可以将值0 作为第二个参数传递。在这种情况下,函数返回 1 看起来会很奇怪。

因此函数应该至少看起来像

long long int prod( const int arr[], size_t n ) 
{
    return n == 0 ? 0 : ( n == 1 ? arr[n-1] : arr[n-1] * prod( arr, n - 1 ) );         
}

这是一个演示程序

#include <stdio.h>

long long int prod( const int arr[], size_t n ) 
{
    return n == 0 ? 0 : ( n == 1 ? arr[n-1] : arr[n-1] * prod( arr, n - 1 ) );         
}

int main(void) 
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    printf( "%lld\n" , prod( arr , sizeof( arr ) / sizeof( *arr ) ) );
    
    return 0;
}

程序输出是

3628800

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2017-10-12
    • 2014-08-28
    • 2022-01-01
    • 2016-12-09
    相关资源
    最近更新 更多