我是递归概念的新手。我想编写一个递归函数,它将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);
}
当我编译它时它没有显示任何错误,但是当我运行程序时它显示出一个分段错误。
我的问题如下:
请用一些具有两个参数的递归函数示例来解释。
答案 0 :(得分:6)
代码错误,因为它永远不会结束(我认为它因堆栈溢出错误而失败)。
对于递归,你需要两件事
看起来你只有第二个。我怀疑在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
。
但是要试着回答你的问题:
请注意,您经常会有一个“常量”值,在递归期间不会更改。要做到这一点,您只需在递归调用中传递值不变,因此每一步都可以使用相同的值。