matlab分段+递归函数的表示方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab分段+递归函数的表示方法相关的知识,希望对你有一定的参考价值。
t=[1 3 5 7 9]
f(x) = 2x , t(1) < x <= t(2)
f(x) = f(t(2)) + 2x^2 , t(2) < x <= t(3)
f(x) = f(t(3)) + 2x^3 , t(3) < x <= t(4)
f(x) = f(t(4)) + 2x^4 , t(4) < x <= t(5)
分段函数的段数为向量t的长度减1,是一个变量。所以不能简单的分为4段。
该怎么用matlab编写呢?
这里不用递归,递推就可以了
先计算每个区间的基数,
例如第一个区间为0,第二个区间为f(t(2)),第三个区间为f(t(3))。。
这是可以根据关系递推的
然后,计算函数值的时候,关键是要区分其应该在哪个区间
函数入下
function f=fun(t,x) %要求t一定是递增的数列b=zeros(size(t));
b(1)=0;b(end)=nan;
for ii=2:length(t)-1
b(ii)=b(ii-1)+2*t(ii)^(ii-1); %计算每个区间的基数
end
num=interp1(t,1:length(t),x);
num=ceil(num)-1; %插值计算x划分在哪个区间
num(isnan(num))=length(t); %处理超过t范围的值
num(num==0)=1; %处理第一个x=t(1)
f=b(num)+2*x.^num; %计算函数值,每个区间的基数加上变量
end
将以上内容保存为fun.m
然后在命令行输入如下的代码,看分段函数的图像
x=1:0.1:9;
y=fun([1 3 5 7 9],x);
plot(x,y);
理论上,t可以有更多的值,分更多的区间,不过要求t是单调递增的数列
参考技术A 乖乖,你这是无线递归啊,算不出来的。奇/偶递归函数中的分段错误
【中文标题】奇/偶递归函数中的分段错误【英文标题】:Segmentation fault in odd/even recursive function 【发布时间】:2022-01-12 14:46:58 【问题描述】:我编写了以下代码,以便使用递归函数查找数字是偶数还是奇数。
#include <stdio.h>
#include <stdlib.h>
int posneg(int n)
if (posneg(n-1)%2 == 0)
return 1;
else
return 0;
main ()
int num;
do
printf("Provide a number");
scanf("%d",&num);
while (num <= 0);
if (posneg(num) == 1)
printf("The number is even");
else
printf("The number is odd");
代码编译成功,但出现分段错误。
任何想法是什么原因?
【问题讨论】:
你的 posneg 函数的递归什么时候停止? "posneg" 是偶数还是奇数?令人着迷。 当数字是奇数或偶数时 整数总是奇数或偶数,所以你是说posneg函数永远不会递归? 尝试手动跟踪逻辑。你会看到它永远不会停止。您需要在递归调用之前测试n
。
【参考方案1】:
您遇到分段错误,因为您的代码导致堆栈溢出。
int posneg(int n)
if (posneg(n-1)%2 == 0)
return 1;
else
return 0;
每次递归函数调用自身时,都会将新的激活记录添加到包含新调用参数的堆栈中。
这个递归函数永远不会评估基本情况,因为它必须确定它是否可以被 2 整除,为了做到这一点,你必须调用函数来评估它。重复此操作,直到您的程序用完堆栈。
【讨论】:
【参考方案2】:确定一个数是偶数还是奇数的函数不适合递归实现,除非目标是说明递归通常不是理想的解决方案。
递归解决方案必须有一个基本情况,否则它将继续调用自己,直到系统耗尽资源并且程序崩溃。
如何递归判断一个数是偶数还是奇数?一种方法是从数字中逐渐加或减 2,直到我们得到 -1、0 或 1(我们的基本情况):
// Let's say a return value of '1' means odd and '0' means even
int evenodd (int n)
if(-1 == n || 1 == n) // base case: n is odd
return 1;
else if(0 == n) // base case: n is even
return 0;
else
return evenodd(n > 0 ? n-2 : n+2);
【讨论】:
@ikegami 当 n == INT_MIN 时会导致 UB。坏主意。 0___________,好的,if (n > 0) n = -n;
然后 :) 但这感觉很奇怪。【参考方案3】:
对于根据 C 标准的初学者,不带参数的函数 main 应声明为
int main( void )
你不能省略函数的返回类型。
其次,如果您期望一个非负数,则将变量 num
声明为具有 int
类型没有什么意义。该变量应声明为具有unsigned int
类型。
由于函数内部的 if 语句,函数会产生无限递归
int posneg(int n)
if (posneg(n-1)%2 == 0)
return 1;
else
return 0;
使用您定义函数的方法,它可以如下面的演示程序所示,例如以下方式
#include <stdio.h>
int posneg( unsigned int n )
return ( n == 0 ) || ( ( 1 + posneg( n - 1 ) ) % 2 );
int main( void )
while ( 1 )
printf( "Provide a non-negative number (0 - exit): " );
unsigned int n;
if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
if ( posneg( n ))
printf( "The number %u is even.\n", n );
else
printf( "The number %u is odd.\n", n );
程序输出可能看起来像
Provide a non-negative number (0 - exit): 1
The number 1 is odd.
Provide a non-negative number (0 - exit): 2
The number 2 is even.
Provide a non-negative number (0 - exit): 3
The number 3 is odd.
Provide a non-negative number (0 - exit): 4
The number 4 is even.
Provide a non-negative number (0 - exit): 5
The number 5 is odd.
Provide a non-negative number (0 - exit): 6
The number 6 is even.
Provide a non-negative number (0 - exit): 7
The number 7 is odd.
Provide a non-negative number (0 - exit): 8
The number 8 is even.
Provide a non-negative number (0 - exit): 9
The number 9 is odd.
Provide a non-negative number (0 - exit): 0
【讨论】:
以上是关于matlab分段+递归函数的表示方法的主要内容,如果未能解决你的问题,请参考以下文章