c递归程序问题

时间:2011-06-03 07:26:57

标签: c++ c segmentation-fault

我是递归概念的新手。我想编写一个递归函数,它将float和integer作为参数,并以浮点值保持不变且整数值改变的方式递归调用

我写下面的代码:

#include <stdio.h>

float sum(float f, int k)
{
    static float c;
    c = f - k;
    c = sum(f, k - 1);
    return c;
}

int main()
{
    float f, g = 10.00;
    int i = 5;
    f = sum(g, i);
    printf("the sum of integer and float = %f", f);
}

当我编译它时它没有显示任何错误,但是当我运行程序时它显示出一个分段错误。

我的问题如下:

  1. 代码有什么问题?
  2. 为什么显示分段错误?
  3. 如何在具有多个参数的函数中使用递归?
  4. 请用一些具有两个参数的递归函数示例来解释。

7 个答案:

答案 0 :(得分:6)

代码错误,因为它永远不会结束(我认为它因堆栈溢出错误而失败)。

对于递归,你需要两件事

  1. 基本案例
  2. 移向基本案例的递归案例
  3. 看起来你只有第二个。我怀疑在k为零时应该返回总和。希望这样的事情有道理:

     float sum(float f, int k) {
         if (k <= 0) {
             // The base case
             return f;
         } else {
             // The recursive case.  This does one step of the work
             // and moves towards the base case
             return 1 + sum(f, k - 1);
         }
     }
    

答案 1 :(得分:2)

您的递归没有基础(非递归),终止案例。

每次调用sum都会对自身进行递归调用,这会一直持续到堆栈溢出,从而导致seg错误。

答案 2 :(得分:1)

递归永远不会停止,最终你会耗尽堆栈。您需要决定何时停止递归。例如,如果k等于0,则不会再次调用sum,而是退出return

float sum(float f ,int k)
{
    static float c;
    if (k > 0)
    {
        c=f-k; /// <<< why is this here? you ignore the value and overwrite it in the next step.
        c=sum(f,k-1);
    }
    return c;
}

当然还有其他问题:将c作为静态可能会影响计算的正确性,而且我标记的地方看起来很可疑,因为你松开了值并用后续的覆盖它致电sum

答案 3 :(得分:1)

这个怎么样?

#include <stdio.h>
float sum(float f, int k, float c) {
    if (k == 0)
        return c;
    sum(f, k - 1, f - k);
}

答案 4 :(得分:1)

我看到的第一件事是你的递归没有终止。它会永远持续下去。也许你想要:

float sum(float f ,int k)
{
    static float c;

    c=f-k;
    if (k != 0)
        c=sum(f,k-1);
    return c;
}

因此当k为零时,递归停止。你有一个堆栈溢出。

答案 5 :(得分:1)

当您进行递归时,您需要一个状态来结束它。

所以你的代码有了变化:

#include <stdio.h>

float sum(float f, int k)
{
    if(k == 0) return f;
    return 1 + sum(f,k-1);
}

int main()
{
    float f, g = 10.00;
    int i = 5;
    f = sum(g, i);
    printf("the sum of integer and float = %f", f);
}

使用该代码,您的示例f = 10.00且i = 5

Call sum(10.0, 5)
return 1 + sum(10.0, 4)
           1 + sum(10.0, 3)
               1 + sum(10.0, 2)
                   1 + sum(10.0, 1)
                       1 + sum(10.0, 0)
                           10
                       1 + 10 = 11
                   1 + 11 = 12
               1 + 12 = 13
           1 + 13 = 14
       1 + 14 = 15
return 15;

答案 6 :(得分:0)

我不明白“sum”功能的用途。它应该添加f和k吗?在这种情况下,没有递归;你应该只添加f和k:return f + k

但是要试着回答你的问题:

  1. 没有基本情况。这是无限递归的原因。每个递归函数都需要一个基本情况,这是递归的条件。无论如何,你的功能都会得到恢复;因此,它将永远递归。
  2. 当递归段错误时,通常是由于堆栈溢出(没有双关语);这意味着你将永远递归并最终耗尽空间。
  3. 您可以在具有多个参数的函数中使用递归,与任何其他函数相同。只需用下一次迭代的新值调用它。
  4. 请注意,您经常会有一个“常量”值,在递归期间不会更改。要做到这一点,您只需在递归调用中传递值不变,因此每一步都可以使用相同的值。